每天学习一个vue插件(9)——MathJax

1,619 阅读1分钟

万物皆有裂痕,那是光之来处

前言

1 介绍

常用方法

typeset

// 排版公式
// text or html 转化为公式
window.MathJax.typeset([el])

typesetPromise

// 异步排版公式
window.MathJax.typesetPromise([el]).then().catch()

tex2chtml

// 公式转换
// 公式字符串转化为DOM
// 仅限text,无法转换html
window.MathJax.tex2chtml(formulaStr)

tex2chtmlPromise

// 异步排版公式
window.MathJax.tex2chtmlPromise(formulaStr).then().catch()

2 使用

配置CDN vue.config.js

const undevelopment = process.env.NODE_ENV === 'development'

// 定义 Webpack 不打包资源列表
const externals = {
  vue: 'Vue',
  'vue-router': 'VueRouter',
  vuex: 'Vuex',
  axios: 'axios'
}

// 定义 CDN 资源
const CDNSources = {
  dev: {
    css: [],
    js: [
      // TODO:按需
      // mathjax
      'https://cdn.bootcss.com/mathjax/3.0.5/es5/tex-mml-chtml.js?config=TeX-AMS_CHTML'
    ]
  },
  prod: {
    css: [],
    js: [
      'https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js',
      'https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js',
      'https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js',
      'https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js',

      // TODO:按需
      // mathjax
      'https://cdn.bootcss.com/mathjax/3.0.5/es5/tex-mml-chtml.js?config=TeX-AMS_CHTML'
    ]
  }
}


module.exports = {
...
  // 插件
  chainWebpack: config => {
    // 通过externals不打包CDN资源
    config.set('externals', externals)

    // 在html文件加载外部CDN资源
    config.plugin('html').tap(args => {
      args[0].CDN = CDNSources[undevelopment ? 'prod' : 'dev']
      return args
    })
  }
  ...
}

引入CDN index.html

<html lang="en">
  <head>
    ...

    <% for (var i in htmlWebpackPlugin.options.CDN &&
    htmlWebpackPlugin.options.CDN.css) { %>
    <link rel="stylesheet" href="<%= htmlWebpackPlugin.options.CDN.css[i] %>" />
    <% } %>

    <!-- 使用CDN的JS文件 -->
    <% for (var i in htmlWebpackPlugin.options.CDN &&
    htmlWebpackPlugin.options.CDN.js) { %>
    <script
      type="text/javascript"
      src="<%= htmlWebpackPlugin.options.CDN.js[i] %>"
    ></script>
    <% } %>
  </head>
  ...
</html>

###渲染公式

<template>
  <div class="Formula">
    <p id="math"></p>
    <p ref="math" class="is-scroll" v-html=“htmlStr”></p>
  </div>
</template>

<script>
export default {
  name: 'Formula',
  data() {
    return {
      htmlStr: ''
    }
  },
  computed: {
    moment() {
      return moment()
    }
  },
  mounted() {
    this.$nextTick(() => {
      // typesetPromise 需要 [] 包裹
      this.htmlStr = '\\[x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}.\\]'
      window.MathJax.typesetPromise([this.$refs.math]).catch(err => err)
      
      // tex2chtml 不需要 [] 包裹
      const htmlStr = `x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}`
      document
        .querySelector('#math')
        .appendChild(window.MathJax.tex2chtml(htmlStr))
    })
  }
}
</script>
<style>
.MathJax {
  // 去除外边框
  outline: 0;
}
.is-scroll {
  // 溢出横向滚动
  max-width: 100vw;
  white-space: nowrap;
  overflow-x: auto;
  overflow-y: hidden;
}
<style>

3.注意

1.使用国内cdn资源,npm install 加载较慢
2.typeset可渲染html结构,tex2chtml只能转换文本
3.公式使用单斜杠\标识,html会自动转换,渲染时需要加两个斜杆 \\sqrt

尾声

今夜吹着风,格外的温柔,乌龟慢慢跑,兔子睡着了

晚安 ^_^

参考链接

往期回顾