终于让 Claude Code 拿当下最热门的静态网站生成框架 Astro 帮我把网站弄起来了,结果发现一个荒谬的问题:即便在生产环境上,页面加载完成之后点击任意站内链接,也会触发一个字体闪烁效果。按理说这完全不应该——第一次页面加载完字体都下载好被浏览器缓存起来了,为什么开新页面还要重新加载一次导致闪烁?
Claude Code 一开始信誓旦旦说这是正常的,我坚持这一定是框架层面的问题,要求它深入研究。结果还真是。Astro 的 Fonts API 把 @font-face 声明内联到了每个页面的 <style> 标签里,MPA 每次导航都是全新 HTML,浏览器每次都要重新解析字体声明。即使字体文件已经在缓存里了,这个「发现→匹配→应用」的过程依然会触发闪烁。
这么做的原因据说是为了消除 render-blocking 资源,让 Lighthouse 评分更好看。一个以内容网站为主要场景的前端框架,为了跑分牺牲了最基础的字体渲染体验,真是非常令人惊叹的设计取舍 — designed for benchmarks and self-praise, not for users.
修复方式反而很传统,把 @font-face 搬到独立的外部 CSS 文件里自己管理,让浏览器能正常利用缓存。Web 2.0 启蒙过去 20 年了,最可靠的方案依然是最朴素的那个。