让Simple-MathJax按需加载

WARNING: This article may be obsolete
This post was published in 2021-09-04. Obviously, expired content is less useful to users if it has already pasted its expiration date.

Simple Mathjax:https://wordpress.org/plugins/simple-mathjax/

这个插件会在所有Wordpress页面上引入MathJax相关的资源文件。如果你使用MathJax 2.x,那么从default.js到config.js, tex2jax.js, MathMenu.js再到MathZoom.js,这些js文件都会按顺序一个一个用http请求下载下来;如果你没有设置 messageStyle: 'none' ,那么这些加载信息还会让你的页面不太好看。如果你使用MathJax 3.x,那么一个1.5M~1.6M的文件(比如tex-svg.js)会一次性请求下来。由于MathJax的加载资源非常庞大,我们当然希望能够按需加载MathJax .

可以用一个非常弱智的判断来让这个插件按需加载,即:只有发现文章中出现mathjax delimiters(分隔符;分界符)的时候才会加载default.js(在MathJax 3下则为tex-svg.js或者其他的资源文件),避免了后续一大串js文件的持续请求。

为了方便代码的逻辑判断,你可以考虑把mathjax delimiters从默认的 inlineMath: [ ['$','$'], ['\\(','\\)'] ] 修改为一个更容易判断的东西。比如本站就使用了这个shortcode: ,所以只需要判断文章中是否存在即可。

当然,如果你已经用 inlineMath: [ ['$','$'], ['\\(','\\)'] ] 写了很多文章了,历史包袱过重,贸然在数据库里进行全局替换可能会引发惨案(稍有不慎可能会误伤到其他内容,比如普通的美元符号$)。为了确保绝对安全,建议不要修改数据库,继续在文章里使用 [ ['$','$'], ['\(','\)'] ] 这样的符号,只是“按需加载”的 准确度 会降低,少部分没有数学公式的文章照样会引入MathJax资源文件(可能是因为带有美元符号$),但起码不会引发别的风险,所有数学公式都能成功渲染。

接下来你就可以把这段代码加入simple-mathjax.php的合适的地方了(注意把下面这段代码中的 DELIMITER-INLINE  DELIMITER-DISPLAY 替换成你自己的delimiters):

// ... 

$content = get_the_content();

// Be sure to replace DELIMITER-INLINE and DELIMITER-DISPLAY with your own mathjax delimiters

if ((strpos($content, "DELIMITER-INLINE") == true && strpos($content, "DELIMITER-INLINE") == true) || (strpos($content, "DELIMITER-DISPLAY") == true && strpos($content, "DELIMITER-DISPLAY") == true)) {

// ... (插件原有的代码保持不变)

}

目前你需要把这段判断代码加在 public static function configure_mathjax() 的开头,以及 public static function add_mathjax() 的开头,只有这段判断代码通过了,才会开始处理MathJax相关的内容。


 Last Modified in 2022-08-29 


Leave a Comment Anonymous comment is allowed / 允许匿名评论