← All projects

构建期 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——对中文技术博客来说比按字数硬除要接近真实体感。