Hexo to vuepress

5/24/2021 blog

记录一下博客更换过程中踩的一些坑,以及自身暴露出的一点问题。

# 为什么要换Vuepress

最近在写一个简易lisp解释器(https://github.com/MarcusMogg/sicp),需要调一个UI方便把markdown文件转换成对应的网页,过程中发现vuepress挺适合这个需求,因为可以在markdown中写vue(但还是有点坑,想做到可编辑的支持高亮的代码块有点难受,前端菜鸡……)。

后来觉得vuepress挺适合做博客的,风格比hexo modern很多,然后选了一个博客主题https://vuepress-theme-reco.recoluan.com/。

# 踩坑

# 安装

vuepress第一大坑点就是现存三个大版本0 1 2,这才三年……

我选的博客主题还没有适配vuepress2

在安装这个主题的时候被vuerouter坑了,应该是vuepress1的残留问题,文件名设置为中文build的时候会疯狂报错,一开始还以为是版本冲突,无语……

# mathjax支持

vuepress-plugin-mathjax,又是一个看起来很美好的东西,一开始看起来还不错,测试了一下才发现,$ 后面跟空格就不行,$$换行也不想,\begin{align}\begin{cases}这些都不支持。

如果直接在head里面引入mathjax也不太行,和vue的加载机制貌似冲突。

解决思路一个是markdownit插件换markdown-it-ketex,不过ketex有点弱鸡

另一个思路就是改这个插件。

作者用的依赖是mathjax3 beta版,用3.1.4(https://github.com/mathjax/MathJax-src)测试了没有问题,所以把源代码里的依赖换了,然后改tex2html.js,参考https://github.com/mathjax/MathJax-demos-node。

这又引入几个坑点,svg显示没有问题,html格式3.14使用的css控制显示内容,和插件原来的处理逻辑不一样。不想花很多精力在这个上面,所以只能用svg了。

# 插件开发

在插件开发的过程中又发现一个问题,这个应该不能说是vuepress插件开发的问题,而是node的问题。

CommonJS和ES之间的冲突,有点无语,为什么不统一啊……

# 和hexo对比

和hexo相比,vuepress的最大优点应该是使用了vue,原生支持了较多的功能。

但对用户来讲,真的简单了吗?

hexo的核心原理是将文本进行处理,然后直接写到模板上。虽然简单粗暴,但是模板是比较成熟而且简单的工具,很HTML本身是非常接近的,也就是说,我们可以很容易的修改一个主题,就像修改一个普通网页一样。

但是vuepress如果想添加一个插件,或者修改一个主题要复杂的多,你需要了解vuepress本身的流程,还要研究对应的插件和主题,这对于非前端人来说还是很麻烦的,对应的hexo的社区似乎比vuepress活跃这也是一个原因?

如果你只是看中一个主题的话,vuepress还是值得一试的,前提是没踩坑……

# 反思

这次换博客主题差不多花费了我4~6小时的时间,说实话有点坑了。

回过头来看看其实问题并不算复杂,主要是自己进入一个陌生领域之后有点无头苍蝇的感觉。

比如node里面的包引用,试了半天,不如先看阮一峰的总结文章。

比如看mathjax demo的时候,直接拿vuepress-plugin-mathjax的逻辑往里面的套,结果进入错误的示例领域,单纯试来试去能发现什么……

希望下次遇到问题的时候,多考虑考虑下面的内容

  1. 你要做什么?你要怎么做?
  2. 使用一个库的时候,先从整体考虑,这个库的工作逻辑是什么,引入当前项目的代价是什么。
  3. 遇到未知问题的时候,搞清楚问题的来源,不要东一戳西一戳。计算机没有玄学。

# 一些参考

vuepress-theme-reco (opens new window)

vuepress-plugin-mathjax (opens new window)

MathJax-demos-node (opens new window)

Node.js 如何处理 ES6 模块 (opens new window)

Last Updated: 5/24/2021, 12:44:45 PM