· #前端#工具 · 453 字 · 约 1 分钟

字体子集化:中文博客的三兆之痛

英文博客随便用一个好看的字体,中文博客要为此付出百倍代价。子集化是这个代价的唯一解。

一个英文博客想用漂亮的衬线字体,代价是几十 KB。一个中文博客想要同样的事情,一整套字体是八到十二兆——等于让每个访客先下载一部短篇小说,才能看到你的标题。

这就是为什么大多数中文网站最后都退回了系统字体。系统字体当然能用,但「能用」和「有性格」之间差着一整个设计的距离。

子集化是唯一的解,思路朴素:整个字体库里你真正用到的字,可能不到一千个。把没用的字全部删掉,剩下的就是你要的「性格」,体积通常缩到原来的百分之五以下。

三条路

实践里有三条路。最省事的是 Google Fonts 的 text= 参数,把用到的字符拼进 URL,它返回一个按需裁剪的 woff2,缺点是每改一次标题就得重新生成一次。正经的做法是用 cn-font-split 之类的工具按 unicode-range 切成几十个小片,浏览器用到哪片下载哪片,适合正文也用自定义字体的场景。最简单的路线干脆只在展示层用自定义字体——大标题、栏目名——正文交给系统字体,体积和性格兼得。

我的选择是第三条加上第一条:标题走子集化的宋体,正文用系统字体栈。代价是每发一篇新文章要跑一次子集脚本,这个代价我愿意付。

顺带一个坑:Google Fonts 的 <link> 方式在国内会拖慢首屏,自托管永远是中文站的正解。字体文件放进自己的 public/ 目录,加 preload,配上 fallback 字体的度量覆盖,切字的瞬间几乎无感。

本文章采用 CC BY-NC-SA 4.0 许可协议。

评论

尚未接入

评论区还没有接入。这个站用 giscus(GitHub Discussions)承载留言: 在 src/components/Comments.astro 里填入仓库配置即可启用,步骤见项目 README。

← 回到全部文章