构建期 Markdown 流水线
把 frontmatter 解析、摘要提取、阅读时长估算、标签聚合全部放到构建期,运行时只读结果。
- architecture
- sveltekit
博客的内容是静态的,所以没有任何理由让它在每次请求时重新解析一遍。
这条流水线的分工是:
| 阶段 | 做什么 | 运行环境 |
|---|---|---|
| 构建期 | 解析 frontmatter、渲染 HTML、高亮代码、提取目录 | Node(vite build) |
| 构建期 | 聚合标签、生成搜索索引、生成 sitemap / RSS | Node |
| 运行期 | 返回文章元数据的 JSON | 边缘函数 |
元数据与渲染分层
关键在于把两件事拆开:
posts.ts只依赖原始 markdown 文本,负责算标题、摘要、标签、阅读时长。它会被边缘函数的 API 引用,所以不能碰marked和shiki。render.ts才引入marked与shiki,只被预渲染路由调用。
这样函数的产物里就不会出现任何高亮器。实测函数包约 450 KB,如果 Shiki 被打进去会是好几 MB 的量级。
frontmatter 解析不用 gray-matter
gray-matter 依赖 Node 内置模块,放进边缘函数有风险。改成自己按 --- 切分 + yaml 解析——yaml 是纯 JS 实现,两边都能跑,代价只有十几行代码。
阅读时长的估算
中英文混排的博客用「英文单词数 ÷ 200」会严重低估。这里把 CJK 字符各算一个单位,拉丁字母按单词算,合计除以 300——对中文技术博客来说比按字数硬除要接近真实体感。