中文网站的字体问题比英文网站麻烦得多。一套中文字体动辄5MB到15MB,直接加载的话,首屏渲染慢两三秒是常态。我去年帮一个客户做网站性能优化,光是字体加载这一项,就把LCP(最大内容绘制)从4.2秒降到了1.8秒。
中文字体为什么这么大
英文只有26个字母加上标点和数字,一套字体文件通常几十KB。中文常用字就有3500个(GB2312),加上扩展字符集能到两万多个。每个字形都是一个独立的矢量图形,文件体积自然就大了。
思源黑体完整版大概16MB,阿里巴巴普惠体大概8MB。你让用户下载15MB的字体才能看到正常页面,在4G网络下大概需要3-5秒。这段时间用户看到的是空白或者系统默认字体,页面闪一下再变——专业术语叫FOUT(Flash of Unstyled Text)。
子集化:只加载你需要的字
最有效的优化手段就是字体子集化。一篇文章用到的中文字可能只有500到1000个,你把这1000个字从完整字体里提取出来,生成一个小字体文件,可能只有200KB到500KB。
工具推荐:Python的fonttools库里的pyftsubset命令,一行代码就能做。或者用中文网提供的在线子集化工具,把文章内容粘贴进去,自动生成子集字体。
但子集化有个坑:如果你的网站内容经常更新,每次都要重新生成子集。我的做法是把网站高频使用的2000个字做成一个基础子集(大概600KB),覆盖95%的场景。剩下5%的生僻字用系统字体兜底。
font-display: swap的正确用法
CSS里加一行font-display: swap,意思是"先用系统字体显示,字体加载完了再替换"。这样用户至少能立刻看到文字内容,不会面对空白页面。
但swap有个视觉问题:字体替换的瞬间页面会"闪"一下。如果你对视觉一致性要求很高(比如品牌官网),可以用font-display: optional——如果字体在100毫秒内没加载完就直接放弃,用系统字体。这样不会闪,但用户可能看到的不是你设计的字体。
我一般给正文用optional(阅读体验差别不大),给标题用swap(标题字体对品牌形象更重要)。
用系统字体栈其实也不错
说实话,2026年的系统默认字体已经很好看了。macOS的苹方、Windows的微软雅黑、Android的思源黑体,单独拿出来都不丑。如果你不做品牌字体,直接用系统字体栈是最快的方案:
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
零加载时间,零FOUT,零CLS。我帮三个预算有限的小客户用了这个方案,PageSpeed分数直接从60多分跳到95以上。
Google Fonts的中文优化
Google Fonts现在支持中文了,而且做了自动子集化。你在CSS里import思源黑体时,它会根据页面实际用到的字符动态返回子集。这个方案对大多数网站来说已经够用了,不需要自己折腾子集化。
但Google Fonts的服务器在国外,国内访问速度不稳定。如果你的用户主要在国内,还是建议自己托管字体文件——把字体下载到自己的服务器或CDN上,加载速度可控。
最后一个建议:上线前用WebPageTest测一下字体加载瀑布图。如果字体文件在关键渲染路径上(阻塞了首屏渲染),把font-face声明放到head里,其他CSS放body底部。字体加载顺序优化好了,整站速度能上一个台阶。
还木有评论哦,快来抢沙发吧~