改回纯系统字体:一次「文档说一套、代码做一套」的自我纠正
2026-06-14约 10 分钟性能一致性决策
目标
在一轮多 agent 评审里,「工程层」专家组抓到一处刺眼的矛盾:CLAUDE.md 与对外口径都写着「字体用系统字体栈,不内嵌」,但 layout.tsx 里实际用 next/font/google 自托管了 Geist / Geist_Mono,构建产物里躺着对应的 woff2,并被 <link rel=preload> 阻塞在首屏大字(hero 的「黄一航」)渲染前。
对一个主打「证据即能力 / 诚实」的站,这种「说一套做一套」是细心面试官打开 Network 一眼就能抓的破绽——比性能本身更伤。
结果
- 删掉
layout.tsx里Geist/Geist_Mono的 import、变量定义与注入到<html>的className变量。 globals.css的--font-sans/--font-mono去掉开头的var(--font-geist-*),直接从ui-sans-serif, system-ui, -apple-system, "PingFang SC"…系统栈起头。- 收益:拉丁字走 San Francisco / Segoe、中文走 PingFang / 微软雅黑,零 web 字体往返,hero 大字不再等字体下载;代码与文档口径自洽。视觉几乎无差(原本中文本来就走系统栈,Geist 只影响拉丁字形)。
踩坑与纠正
这其实是早先「苹果风改版」时埋下的:当时从脚手架默认的 Next 模板继承了 next/font 的 Geist,写文档时按「想要的样子」写了「系统字体栈」,却没回头删掉模板带来的自托管字体——典型的「文档先于代码、之后没对齐」。教训:口径性的铁律(用什么字体、加不加依赖)要直接拿构建产物核对(数 woff2、看 preload),不能只信注释。
用时与备注
约 10 分钟。问题由多 agent 评审定位,修复与核对(确认产物里不再有 Geist woff2)由 AI 完成。