苔 苔痕 MOSSLINE
系统设计

预渲染:把 Markdown 一次性烧成 HTML

每次请求都解析 Markdown 是浪费。写作时算一次,之后所有访问都只读结果,这是最便宜的优化。

每次请求都解析 Markdown 是浪费。写作时算一次,之后所有访问都只读结果,这是最便宜的优化。

什么时候算

只有一个时机:保存文章时。

$html = Markdown::toHtml($md);
DB::update('posts', ['content_html' => $html], 'id = ?', [$id]);

保存之后,前台渲染就是拼接字符串,没有任何解析开销。

顺带解决的问题

预渲染之后,目录也可以提前抽好。解析时收集 h2/h3,生成带锚点的标题和一份 JSON,前台直接输出侧边导航。

  • 标题锚点稳定,不会因为二次解析而变化
  • 目录与正文永远一致
  • 结构化数据(FAQ、面包屑)可以从同一份结果生成

代价是什么

代价是修改渲染规则要重算。改一次 Markdown 解析器,就得把所有文章重新跑一遍。

这个代价可以接受,因为渲染规则很少变。真正常变的是内容和样式,而它们不影响预渲染结果。

把计算放在低频路径上,把读取放在高频路径上。这是缓存的第一性原理。

一个细节:摘要

摘要也从预渲染里来。取正文第一段,去掉 Markdown 标记,截到 120 字,末尾加省略号。作者不填就用这个,填了就用作者的。

省下的不是时间,是写作时的决策负担。

留言 0

评论会在审核后显示

还没有留言,来说点什么吧。

支持纯文本,提交后不可修改。