每次请求都解析 Markdown 是浪费。写作时算一次,之后所有访问都只读结果,这是最便宜的优化。
什么时候算
只有一个时机:保存文章时。
$html = Markdown::toHtml($md);
DB::update('posts', ['content_html' => $html], 'id = ?', [$id]);
保存之后,前台渲染就是拼接字符串,没有任何解析开销。
顺带解决的问题
预渲染之后,目录也可以提前抽好。解析时收集 h2/h3,生成带锚点的标题和一份 JSON,前台直接输出侧边导航。
- 标题锚点稳定,不会因为二次解析而变化
- 目录与正文永远一致
- 结构化数据(FAQ、面包屑)可以从同一份结果生成
代价是什么
代价是修改渲染规则要重算。改一次 Markdown 解析器,就得把所有文章重新跑一遍。
这个代价可以接受,因为渲染规则很少变。真正常变的是内容和样式,而它们不影响预渲染结果。
把计算放在低频路径上,把读取放在高频路径上。这是缓存的第一性原理。
一个细节:摘要
摘要也从预渲染里来。取正文第一段,去掉 Markdown 标记,截到 120 字,末尾加省略号。作者不填就用这个,填了就用作者的。
省下的不是时间,是写作时的决策负担。
留言 0
评论会在审核后显示还没有留言,来说点什么吧。