在 Gatsby 中与 MDX 一起使用 KaTeX
December 24, 2021 · 3 min read
前言
一开始,我跟据网上的教程为我的使用了 MDX 的 Gatsby 站点添加了 支持,比如使用 gatsby-remark-katex, 但是遇到了很多问题,很多都是版本的兼容性问题。
尽管很多情况下,把各种依赖项降级就能解决问题,但是我本人并不喜欢降级依赖项,旧版本的依赖项一般具有更多的 Bug 和安全问题。(然而我还是使用了旧版的 remark-math 😂)
解决方案
首先,直接使用 相关的 remark/rehype 底层插件,而不是通过 gatsby-remark-katex 这样的封装过的插件。
下面是我的站点的 package.json 的一部分,其中高亮出来的是和配置 相关的依赖项。
注意,因为在我撰写本文的时候,gatsby-plugin-mdx 的使用 mdx.js v2.0 的版本还没有发布,所以 gatsby-plugin-mdx 内部使用的是第一代 mdx, 这导致 gatsby-plugin-mdx 使用的 remark 版本比较低(^10.0.1),而 remark 在 v13.0 中作出了重大改动(micromark),因此很多新版本插件和新插件只兼容 v13 及以上的版本,无法和 gatsby-plugin-mdx 一起使用,我们用到的 remark-math 就是其中之一。
另外,JavaScript 有了标准的模块实现(ESM), 很多 remark 插件不再与 CommonJS 的模块兼容,我们在加载这些使用 ESM 的插件时需要使用来自 gatsby-oi-wiki 的 esmRequire. (在此向 gatsby-oi-wiki 致谢)
esmRequire.js: https://github.com/OI-wiki/gatsby-oi-wiki/blob/7ae4ff89dfa16ee3ee4437a3f157b2dee4cc9f23/gatsby-theme-oi-wiki/esmRequire.js- 相关讨论: https://github.com/gatsbyjs/gatsby/issues/23705
使用你最喜欢的 JavaScript 包管理器安装好依赖之后,我们来修改一下 gatsby-config.js:
其中,remark-math 解析 Markdown 的数学语法,rehype-katex 负责将 <span class=math-inline> 和 <div class=math-display> 这样的标签用 渲染出来.
然后,我们在博客的模板文件 src/templates/blog-post.js 里面引入 的 css 就大功告成了!
下面是数学公式的示例: