阅读提示
本文约 867 字,预计阅读 3 分钟。文中命令与配置均经过实测,可直接参考执行。
本文约 867 字,预计阅读 3 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:一套中文字体 10MB 起步
英文站用一个 20KB 的 woff2 就够,中文站光常规字重就可能上 10MB,日韩也类似。多语言站若一次性加载所有语言字体,首屏直接崩。
原理分析:为什么字体是大头
中文字符集超两万,全量字体文件极大;而拉丁语系仅百字符。解决方案核心是”子集化(subset)”——只打包页面实际用到的字符,以及”按语言加载”——当前语言才请求对应字体。unicode-range 是 CSS 原生机制,让浏览器只下载命中的子集。
保姆级实操
- 子集化工具:用
pyftsubset(fonttools)按语言字符表裁剪:
pyftsubset NotoSansCJK-Regular.ttf --text-file=zh.txt --output-file=zh-subset.woff2 --flavor=woff2
- CSS unicode-range:为每种语言定义
@font-face并设unicode-range,如中文U+4E00-9FFF。 - Google Fonts 参数:用
&subset=cyrillic等按需引入,避免加载全部。 - Variable Font:用可变字体单文件覆盖多字重,减少请求数。
- 字体预加载:仅
preload当前语言首屏字体,其余font-display:swap。
常见踩坑
- 案例:某站同时
<link>了中、日、韩、阿四套全量字体,首屏下载 28MB,LCP 6s,改用子集后 1.2MB。 - 子集漏字,某些文言字显示为方框(豆腐块)。
- 用
unicode-range但没设font-family回退,缺字无兜底。 - Google Fonts 没带
display=swap,字体加载期文字不可见(FOIT)。
总结
多语言字体 = 子集化 + unicode-range + 按需预加载。务必为每个语言单独打包子集并设回退。字体体积也直接影响 多语言站点Core Web Vitals,是 LCP 的关键变量。
觉得有用?点个赞支持一下
标签:
# font-subset 多语言
# Google Fonts 按语言
# unicode-range
# web font
# WordPress 字体子集
# 中日韩字体体积
# 多语言 web font
# 多语言字体
# 多语言站点字体优化
# 字体子集
# 首屏优化
