字体压缩方法

项目做了一个动画,几个特殊的文字,引入了一个新的字体文件(1.46 MB);又为了几个标题好看,引入了一个更大的字体文件(78.4MB)。
很遗憾,如此粗暴的做法,浏览器拒绝了:

Failed to decode downloaded font: /fonts/%E7%AB%99%E9%85%B7%E5%86%B7%E6%B0%B4%E8%90%A7%E9%9D%92%E5%88%BB%E5%8F%A4%E5%85%B8%E4%BD%93.ttf
index.html:1 OTS parsing error: Web font size more than 30MB

Chrome浏览器拒绝解析30MB以上的字体文件。
于是,开始了寻求字体压缩之路。

直接编辑字体

由于字体文件实在太大,连浏览器都不能解析了,只能对字体文件进行优化。
最初,UI设计把字体文件中的符号、特殊字体以及很大一部分中文进行了删除。
半个小时过后,终于给了我们第二版字体文件。然鹅,中文字删多了,有些字显示不正确。
于是,又过了半个小时。我们收到了第三版。可是,我们发现还是删多了。。
。。。
进行了 几轮的反复的修改测试之后,我们最终拿到了支持所有文字的版本。
但是,字体文件还是>5MB
我们只能得出结论,这只是一个吃力又然并软的办法。

字蛛FontSpider

字蛛是一个中文压缩器。对静态页面友好,但是对于我的React项目就一点都不好。

  • 安装
npm install font-spider -g
  • 使用方法
    在CSS中引用WebFont,并将字体应用于html文件的文本:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <style>
        /*声明 WebFont*/
@font-face {
  font-family: 'pinghei';
  src: url('../font/pinghei.eot');
  src:
    url('../font/pinghei.eot?#font-spider') format('embedded-opentype'),
    url('../font/pinghei.woff') format('woff'),
    url('../font/pinghei.ttf') format('truetype'),
    url('../font/pinghei.svg') format('svg');
  font-weight: normal;
  font-style: normal;
}

/*使用选择器指定字体*/
.font-pinghei {
    font-family: 'pinghei';
}
    </style>
    <pre><code class="font-pinghei">
测试文本1哟
0123456789
abcdefghijklmopq
测试文本2哟
</code></pre>
</body>
</html>
  • 执行压缩命令
font-spider index.html

因为只保留了选中的文本,压缩后的字体文件会变得很少。1.46 MB大小的文件压缩后只剩大约8k。
可惜在处理78.4MB文件的时候失败了,压缩后的字体只留了部分被选中的文本 (. 这个是为啥呢?)。
我们只得继续。。。

Fontmin

可喜可贺,我们找到了一个非常好的工具。之所以能找到,还要得益于FontSpider。在FontSpider中一探究竟时,我们发现了它其实用的是fontmin。
Fontmin --- 第一个纯 JavaScript 字体子集化方案
于是,学习了一把。发现这真是一个好东西。不仅提供了npm模块,还有跨平台的桌面应用。
本来想自己写一个js来生成字体的,发现它的桌面应用简单好用,就不折腾了,下了Window桌面版。


  1. 按提示将字体文件拖入界面

  2. 输入需要保留的文本


  3. 点击生成
    最终会生成6个文件,包括4个不同格式的字体文件:eot/svt/ttf/woff,一个定义字体的css文件,一个嵌入字体的css文件。



    总之一句话,操作简单不报错。
    如有需要,强烈推荐。

总结

这几种压缩字体的原理都一样,都是对原有字体文件进行删减,只保留需要的文字。
第一种方法难且效率低;第二种有错误不完善;相对来讲,第三种会更简单一点,如果有需要的话还可以基于它定制自己的自动化脚本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352