告别 Hexo:本站重构小记
本站从 2019 年跑到现在,一直是 Hexo 5.4.0 + NexT 7.8.0 生成静态页。这套东西当年很好用,但到了 2026 年问题越来越多:
- 依赖链老旧:Hexo 5.4 的依赖树里一堆不再维护的包,Node 版本一升级就莫名报错;
- 生成产物臃肿:每个页面挂 5 个 JS 文件、42KB 的 CSS,还有被墙的 Google 统计和 cdnjs 外链,对国内访问者纯属负担;
- 模板黑盒:想改个页脚都要翻 NexT 的 swig 模板,改完还怕下次升级被覆盖。
而这个站的实际需求是什么?一个挂备案的静态站 + 偶尔写写笔记。90% 的 Hexo 功能(评论、搜索、多语言、插件生态)根本用不上。
重构方案
结论:不换框架,直接自己写。整个"生成器"是一个 200 行左右的 build.py:
site/posts/*.md -> /posts/<slug>/index.html 文章页
-> /index.html 首页(最新文章列表)
-> /posts/index.html 新文章索引
-> /sitemap.xml 全站地图(含旧页面)
技术选型刻意保持最小:
| 项目 | 选择 | 理由 |
|---|---|---|
| 语言 | Python 3.12 | 熟悉,标准库够用 |
| Markdown 渲染 | markdown + Pygments |
两个纯工具库,无框架 |
| 模板 | 内置 f-string | 显式,没有第二套模板语法 |
| 前端 | 单个 CSS 文件,零 JS | 静态内容站不需要脚本 |
写作流程就是:在 site/posts/ 下新建一个带 front-matter 的 Markdown,跑一次构建,完事。
# 日常写作只需要两步
$EDITOR site/posts/my-new-post.md
.venv/Scripts/python.exe build.py
兼容性处理
旧站有 80 篇 2019-2021 年的文章,不少地方有外链指向。重构的原则是旧 URL 一个都不能死:
archives/、page/、categories/、tags/、about/全部原样保留,继续用旧样式;- 首页新增"历史归档"入口指向
/archives/; - 新文章放在独立的
/posts/命名空间下,和旧路径零冲突; sitemap.xml把新旧 URL 一起列出来,搜索引擎无感切换。
顺手修了两个历史遗留 bug:旧文章里的 ./resources/... 相对路径图片在 /archives/ 子目录下会 404(原站所有文章配图一直是挂的),已全部改为绝对路径。
效果
- 首页从 35KB HTML + 5 个 JS 请求,变成 9KB HTML + 1 个 CSS,零 JS;
- 没有任何国外 CDN 依赖(连图标字体都去掉了);
- 构建"框架"的全部代码一眼能读完,安全审计成本约等于零。
对于一个挂备案的站来说,这个复杂度刚刚好。以后想加功能,改 build.py 就是了——毕竟整个生成器比一篇 NexT 的配置文档还短。