去年 11 月我们做过一次对比:同一个页面,字体分别放 Google Fonts 和放国内 CDN 自托管,从北京、上海、广州三地各测 50 次。Google Fonts 的字体请求 P75 是 1.2 秒,有 6 次超时超过 3 秒;自托管的 P75 是 180 毫秒,没有超时。
这个差距比图片优化大得多。字体是阻塞渲染的资源,它慢一秒,首屏就晚一秒。
为什么会差这么多
两个原因。一是 Google Fonts 的域名和节点在境外,国内访问要过国际出口,高峰期不稳定。二是它的 CSS 和字体文件来自不同域名,多两次 DNS 和 TLS。
自托管把字体和页面放在同一个域名或者同一个 CDN,省掉域名解析和连接建立,路径短,稳定性也好。
我的建议很直接
面向国内用户的软件站,字体必须自托管,没有例外。做跨境的站,英文站可以用 Google Fonts,但如果国内访问占比超过两成,也建议自托管,用同一份文件走全球 CDN。
自托管要做三件事:字体子集化、font-display 设置、正确的 CORS 头。第三点常被忽略,字体文件跨域加载需要 Access-Control-Allow-Origin,配错了浏览器直接拒绝使用,控制台一堆 CORS 报错。
一个踩过的坑
有个客户把字体放在自己的静态资源域名上,那个域名没接 CDN,走的是源站单线机房。字体文件 300KB,南方用户下载要 2 秒。挪到主站 CDN 之后降到 200 毫秒。
这说明自托管不等于快,得确认字体文件走的是 CDN 而不是源站。查法很简单:网络面板里看字体请求的响应头有没有 CDN 标识,或者直接看 age 和 server 字段。
第三方字体服务值不值
国内有几家做网页字体分片的服务,用它们的 CDN,按流量计费。适合不想自己管子集的团队,代价是每年几千到几万的费用,以及多一个依赖。
我们的判断:日访问量十万以下,自托管更划算;超过这个量级,第三方服务的分片和缓存策略往往比自建做得好。
一条底线
不管选哪种,字体文件不要超过 300KB,首屏只加载真正用到的那个。这两条做不到,换什么方案都救不了首屏。
一个简单的验收方法
改完之后,让北京、上海、广州各一个真实用户打开页面,看网络面板里字体请求的耗时和状态码。三个地方都稳定在 300 毫秒以内算过关。
再检查一遍缓存头:字体文件名带 hash、缓存一年、不要设 Vary: User-Agent。有些 CDN 默认带这个头,会把缓存命中率打下来,字体每次都回源,等于没自托管。
元析智能
为软件公司做 SEO 和 GEO 优化