为什么要从 Hexo 转到 Hugo?
性能
Hexo 使用 NodeJS 编写,而 Hugo 使用 Go 编写,尤其是对于公式图像繁多的文章,编译速度差异巨大
以本 Blog 为例进行编译
Hexo, 总耗时 11s + 8.61s = 19.61s
INFO Validating config
INFO Start processing
INFO [Fluid] 读取 _config.yml 中 theme_config 配置项覆盖配置
SVG - Unknown character: U+FF0C in MathJax_Main,MathJax_Size1,MathJax_AMS
....
SVG - Unknown character: U+6709 in MathJax_Main,MathJax_Size1,MathJax_AMS
update link as:-->/post/ap-psycho/Untitled.png
update link as:-->/post/ap-psycho/Untitled%201.png
update link as:-->/post/ap-psycho/Untitled%202.png
update link as:-->/post/ap-psycho/Untitled%203.png
update link as:-->/post/ap-psycho/Untitled%204.png
....
update link as:-->/post/ap-em1/2021-11-09-13-20-45.webp
update link as:-->/post/ap-em1/2021-11-09-19-07-23.webp
INFO 感谢使用 Fluid 主题 !
INFO Files loaded in 11 s
INFO Deleted: post/ap-em2/2021-11-10-04-12-14.webp
INFO neat the html: about/index.html [ 20.18% saved]
....
INFO neat the html: links/index.html [ 25.10% saved]
INFO Generated: baidusitemap.xml
INFO Generated: sitemap.xml
....
INFO Generated: post/ap-psycho/Untitled 52.png
INFO Generated: atom.xml
INFO Generated: local-search.xml
INFO Generated: search.xml
INFO 71 files generated in 8.61 s
Hugo, 总耗时 2.025s
$ hugo --gc
Start building sites …
hugo v0.93.0-DEV+extended darwin/amd64 BuildDate=unknown
| EN
-------------------+------
Pages | 149
Paginator pages | 33
Non-page files | 659
Static files | 0
Processed images | 18
Aliases | 58
Sitemaps | 1
Cleaned | 0
Total in 2025 ms
接近 10 倍的差距,且随着文章数量的上升 Hexo 的构建体验会显著性的下降
开发环境
- NodeJs 使用极其恶俗的
npm
包管理,致使node_modules
繁复硕大如瘤的同时存在各种嵌套依赖的问题,尤其是在 Hexo 对于MathJax
一类的支持极其混乱。- 不同的包用着各式不同版本的
MathJax
渲染页面 - 大多数参数不可控制,比如我们需要使用的
mchem
宏包,需要强行修改node_modules
下关于MathJax
的代码才得以实现
- 不同的包用着各式不同版本的
- Hugo 则完全不存在这种问题
- 首先是 Hugo 本体与前端剥离,安装 Hugo 不需要安装任何 Hugo 依赖
- 刚刚提到的关于
MathJax
的部分完全可以交由theme
自由处理,且用户可以轻松更改,不会和 Hugo 本体冲突(Hexo 拓展和本体共用依赖库)
- 且 Hugo 的创作环境更有利于内容的长期管理,如下所示
Hugo 的内容管理,每篇文章独立项目文件夹
├── post (主文件夹)
│ └── operator-precedence (项目文件夹)
│ ├── index.md (文章内容)
│ └── operator-precedence (图像资源)
│ ├── c-operator-precedence.webp
│ └── tree.webp
Hexo 的内容管理,每篇文章都在
_posts
主文件夹下
_posts (主文件夹)
├── acsl (文章图像资源)
│ ├── ...
│ └── xxx.webp
├── acsl.md (文章内容)
├── ap-cal-bc
│ ├── ...
│ └── xxx.webp
├── ap-cal-bc.md
├── ap-chem
│ ├── ...
│ └── xxx.webp
└── ap-chem.md
特性支持
- Hugo 的 RSS 生成可以由
theme
完全控制,Hexo 的 RSS 在引入Lazyload
后无法加载任何图片 - 我们使用的主题 CaiJimmy/hugo-theme-stack,相较于
Hexo 上的 fluid-dev/hexo-theme-fluid
拥有更多功能
- 更加简洁易用,Stack 主题使用 Sass,无 JQuery 的轻量开发
- 相比而言,Stack 使用 Sass 极大的拓宽了我们的定制化范围
- Stack 主题的审美相较于 Fluid 更胜一筹
反转
当然 Hexo 并不是一无是处,Hexo 对于 Pandoc 的支持远远强于
Hugo,允许完全自由的选择各种不同的 Markdown 渲染器。 而 Hugo
对不同渲染器的支持大相径庭,所有渲染器参数在代码内写死,并且对于诸如
Markup Hook
这样的功能大多数只支持 Goldmark
(属于是 Hugo 唯一指定推荐 Markdown 渲染器了),而 Goldmark
对于 \(\LaTeX\)
的支持可以说是一塌糊涂。
在接下来的 Hexo 迁移 Hugo 的过程 中会着重探讨这些细节。