字体包体积压缩实践

2,426 阅读2分钟

背景

在项目里,设计稿这边使用了"思源"的字体-SourceHanSerifSC-Heavy。于是就把用到的字体Heavy.otf引进项目,但是最后发现字体大小达到了 21.8MB,首次加载时间为6秒,体验不佳,需要对字体包进行优化。

解决方法

网上查阅,字体包压缩通过font-spider实现。

font-spider通过分析本地的CSS与HTML文件获取字体中没有使用的字符,并把这些字符数据从字体中删除以实现压缩,同时生成跨浏览器使用的格式。

  1. 全局安装font-spider

npm i font-spider -g

  1. 复制代码,新建一个项目,或者使用目前正在做的项目

目录结构:

index.html中应用该字体:

 @font-face {
     font-family: SourceHanSerifSC;
     src: url("./source/SourceHanSerifCN-Heavy.otf");
 }
  1. cmd进入test项目文件夹,执行如下命令:
font-spider index.html

如果多个html文件中均引用该字体,则执行如下命令:

font-spider *.html

命令执行查看结果,并没有像网上讲的字体包被压缩,大小未变化。所以关键点来了,使用font-spider压缩的字体包必须为ttf类型。

  1. otf转ttf

关于otf转ttf的教程很多,常用的使用工具有 FontCreator(使用这个的较多), FontLab Studio, FontForge,我这里没有安装自己去转换,有人已经做好了转换,并把字库放在了 GitHub 上面,在此分享一下:

github.com/be5invis/so…

github.com/junmer/sour…

github.com/Pal3love/So…

  1. 使用font-spider对ttf字体包进行压缩提取

将字体包以及html的引用更换好之后,再次执行font-spider *.html命令,命令执行结果:

文件中执行结果:

字体包从原来的12794.548KB压缩为90.452KB,且测试后字体效果生效。因为它把多余的文字去掉了,只提取我们页面出现的那些文字。

优缺点

优点:

如上,字体包体积被优化,加载性能提升;

缺点:

font-spider虽然好用,但是由于其原理是直接分析本地 CSS 与 HTML 文件获取没有WebFont中没有使用过的字符,这样一来,对于动态生成的文字,就没有办法使用font-slider了。

尤其在当下,很多框架都是数据驱动的,更是很多文字都不会直接出现html文件中。对于框架的话,font-spider就不能适用了。

对于目前我这种没使用框架的情况,如果后面有新增的html使用了思源宋体或者原html中某个位置新增思源宋体的使用的话,需要再次执行下font-spider *.html命令,字体包中将新增的文字加进去。