A 40-line build script, and the trade-offs behind it
起因
我需要的是:把 Markdown 变成 HTML,套一层布局,生成 sitemap 和 404 页。就这些。
市面上的静态站生成器都能做,但它们同时带来了插件生态、主题约定、依赖树, 以及"我得先读懂它的文档才能改一句话"这一层成本。对一个月更一次的个人站, 这笔交易不划算。
我实际写了什么
一个七百行的 build.mjs,只用 Node 内置模块:
const css = await hashAsset('assets/style.css')
- 解析 frontmatter(一层键值对 + 缩进子键,够用)
- Markdown → HTML(先整体转义,再翻译语法,所以正文里写
<script>只会显示为文本) - 套模板、生成 sitemap / robots / 404
- 给静态资源算内容指纹,文件名随内容变,于是可以放心长缓存
换来了什么
依赖树是空的,所以永远不会有 CVE 告警。构建不联网,三年前装的环境现在照样跑。 任何一行行为我都能读懂——出问题时是从头查,而不是猜框架在干什么。
代价是什么
这不是没有代价的取舍,列清楚:
| 场景 | 现在的感受 |
|---|---|
| 想要插件(搜索、分页、RSS) | 得自己写,还得自己补测试 |
| 文章超过 15 篇 | 没有分页,列表会变长 |
| Markdown 语法想扩展 | 改 bin/markdown.mjs,同一个文件里加,也在那儿测 |
个人站的内容量级下,这三行表还不足以推翻前面的收益。等哪天真的撞上了再改—— 那时候我已经把问题想清楚了,而不是在框架文档里找答案。