告别 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 一个都不能死:

  1. archives/、page/、categories/、tags/、about/ 全部原样保留,继续用旧样式;
  2. 首页新增"历史归档"入口指向 /archives/;
  3. 新文章放在独立的 /posts/ 命名空间下,和旧路径零冲突;
  4. sitemap.xml 把新旧 URL 一起列出来,搜索引擎无感切换。

顺手修了两个历史遗留 bug:旧文章里的 ./resources/... 相对路径图片在 /archives/ 子目录下会 404(原站所有文章配图一直是挂的),已全部改为绝对路径。

效果

  • 首页从 35KB HTML + 5 个 JS 请求,变成 9KB HTML + 1 个 CSS,零 JS;
  • 没有任何国外 CDN 依赖(连图标字体都去掉了);
  • 构建"框架"的全部代码一眼能读完,安全审计成本约等于零。

对于一个挂备案的站来说,这个复杂度刚刚好。以后想加功能,改 build.py 就是了——毕竟整个生成器比一篇 NexT 的配置文档还短。

← 返回首页 · 历史归档