相比于英文的字库来说,中文字库的体积非常之大,小则1M,动辄几十 M 的体积非常常见。所以在前端页面性能优化中,字体加载的优化就显得尤为重要。阅读了相关的知识和文章,在研究了市面上字体加载方案之后,我总结出了目前可行的方案。

1、font-spider

字蛛是一款可以压缩字体文件的小工具,其主要的原理就是,通过html页面获得文字以及对应的字体文件,然后把已经使用文字保留,没有的文字去除,生成一个新的字体文件。
安装

使用:

命令执行完会在原字体处生成一个新的字体文件,而旧的文件会保存在font-spider文件夹下,新生成的就是压缩后的字体文件。至此,工具的使用方法介绍完了。

字蛛工具的优点和缺点都十分的明显。
优点:能够把没有使用的字符丢弃,只保留使用到的字符,这对于字体文件的体积优化是非常大的。
缺点:不够灵活,每次有内容更新都需要跑一遍脚本,而且致命的缺点是只能够识别html文件中的文字,后端返回的文字并不能被识别。所以不能适应于一般的框架项目。当然,如果你愿意再入口文件把你所有用的文字都放进去,然后再压缩,我也没有意见。

2、加载完成前使用降级字体

目前浏览器对于自定义字体不存在时的解决方案有两种:

  • 加载完成前隐藏(FOIT, Flash Of Invisible Text)

  • 加载完成前使用降级字体(FOUT, Flash Of Unstyled Text)。
    很显然,如果选择FOIT的显示方式的话,如果我们的自定义字体没有加载出来的话,那么我们的页面就一直显示的是空白的页面,这对于用户体验来说是致命的。所以,FOUT这个方式才是更合适的解决方案。
    提到FOUT,不得不提到一个 @font-face 指令的描述符: font-display

    @font-face {font-family: "sans-medium";src: url(./font/NotoSansSC-Medium.otf);font-display: swap;
    }
    
  • block:表示文档会block一段时间(阻塞期大概3s)来等待远程字体文件的下载,该时间内字体如没有完成下载,使用备选字体,等远程字体下载完毕后再进行替换。

  • swap:表示文档不会block(极短的阻塞期< 1s),直接使用备选字体,远程字体下载完毕后再进行替换。

  • fallback:表示文档不会block(极短的阻塞期<1s),直接使用备选字体,并且在交换期(大概是2s)内下载完毕则进行字体替换,否则放弃使用远程字体。

  • optional:表示文档不会block(极短的阻塞期< 1s),这么短时间内字体完成加载则使用字体否则放弃使用。

  • auto:自动模式,由浏览器决定(chrome下行为跟swap类似)

那么在了解 font-display 之后,那么我们应该不难看出来,对于大部分情况应该把它的值设置为 swap ,这样在加载网络字体期间,使用后备字体进行渲染,加载完成之后在替换为指定的网络字体。

优点:在自定义字体没有加载出来之前,能够正常的显示页面,只不过字体是降级字体。不会因为加载字体文件而导致页面阻塞。
缺点:在自定义文字和默认文字存在较大视觉差异时,会影响用户视觉体验!

3、网络字体

很多公司都会把自己的静态资源放在CDN上,从而增加资源获取速度。字体也不意外,完全可以放在CDN上,增加加载的速度。同时也可以使用第三方字库,如 google fontweb font等第三方字库,他们会对字体文件进行自己的优化和处理,能够很大程度的提高加载速度。
优点:加载速度快。
缺点:增加不必要的外链,影响安全性,受制于第三方库

4、字库切分

这个方案,完美的解决了以上3中方案中存在的不足,可以说是目前为止,最为完美的解决方案。
字库切分,顾名思义是把一个字库切分成多个小的字体,减少单个字体文件的大小,从而减少字体阻塞的情况发生。可以在 mdn 关于 unicode-range - CSS: Cascading Style Sheets | MDN (mozilla.org) 的介绍中看到:

浏览器只会在页面使用了该范围中的字符时才会加载对应的字体“分片”。也就是说页面初始化时给浏览器一个目录,在页面要渲染字体时再去根据目录加载所需的字体文件。这不就是字体文件的按需加载嘛
谷歌字体也采用了这一方案,通过机器学习,把一些可能出现在同一个页面的上字符组成一个字体片段,一个中文字体库分割成数百个字体片段,然后通过css的方式进行引入。参考sans字体css。
我们就以谷歌的这个字体为例,只需要把这个css引入到我们的项目之中,然后我们在页面上使用这个字体。
当然,你可以把谷歌的css以及对应的字体切片的文件下载下来,放在项目本地。可以用到一个小工具
google-font-splitter - 一个用于下载谷歌分割字体的命令行工具把我们需要的资源下载下来。
部分css代码:

@font-face {font-family: "sans-regular";font-style: normal;font-weight: 400;font-display: swap;src: url(s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2)format("woff2");unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e
}@font-face {font-family: "sans-regular";font-style: normal;font-weight: 400;font-display: swap;src: url(s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2)format("woff2");unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8
}
<div class="medium"><span class="bold">HTML、CSS、JavaScript</span>这三个是前端开发中最基本也是最必须的三个技能。前端的开发中,在页面的布局时,HTML指的是超文本标记语言 (<span class="regular"> Hyper Text Markup Language</span>),这个也是我们网页最常用普通的语言了,CSS级联样式表(<span class="regular">Cascading Style Sheet</span>)简称“CSS”,通常又称为“风格样式表(<span class="regular">Style Sheet</span>)",它是用来进行网页风格设计的。比如,如果想让链接字未点击时是蓝色的,当鼠标移上去后字变成红色的且有下划线,这就是一种风格。通过设立样式表,可以统一地控制HTML中各标志的显示属性。级联样式表可以使人更能有效地控制网页外观。使用级联样式表,可以扩充精确指定网页元素位置,外观以及创建特殊效果的能力。JavaScript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Javascript,提供了数据验证的基本功能。</div>

在我们正常加载这三种字体时的效果:

通过字体切分之后的效果

由此看见,提升的效果还是非常明显的。
优点:

  1. 比起加载完整字体文件来讲,每个字体片段更小,
  2. 可以在添加font-display来进行字体降级,从而让用户体验更加友好。
  3. 按需加载,不需要把所有的字体片段都加载进来。

缺点:对于字体库切片,可能谷歌上的可选字体比较少,如果碰巧你的自定义字体,在谷歌字体上没有找到,那就pass了。或者你有能力进行字体分割,那更好!

5、和产品辨雄雌

优点:全是优点。
缺点:容易被打。

以上就是我整理的字体优化相关的5种方案,总的来说,我个人觉得第五种是最完美的,其次就是第四种。

前端页面性能优化 - 字体加载优化相关推荐

  1. Android 浏览器内核浅谈,基于WebKit内核的Android手机浏览器的性能研究与加载优化...

    南京邮电大学 硕士 2017 基于WebKit内核的Android手机浏览器的性能研究与加载优化 Performance Research and Load Optimization of Andro ...

  2. 【CEGUI】字体加载优化

    CEGUI 字体加载优化 CEGUI字体加载流程详见[CEGUI]Font资源加载流程 CEGUI对于字体加载,例如Freetype类型字体,会通过libfreetype遍历字体文件的所有字形索引,并 ...

  3. iOS性能优化 - 网络图片加载优化

    导语:App中显示的图片大部分来自服务器,一般使用SDWebImage帮我们下载并显示,但是这并不是最好的效果,本文介绍如何优化网络图片的显示. 友情提示:性能优化是个无底洞,建议适可而止. 一.存在 ...

  4. 前端性能优化学习 08 资源加载优化

    图片延迟加载 什么是延迟加载 首先来想象一个场景,当浏览一个内容丰富的网站时,比如电商的商品列表页.主流视频网站的节目列表等,由于屏幕尺寸的限制,每次只能查看到视窗中的那部分内容,而要浏览完页面所包含 ...

  5. 前端页面图片加载优化

    前端页面图片加载优化 问题:前端页面如果图片资源过多或者过大就会导致用户加载图片时间过长,导致用户体验下降 我总结的优化思路与方法有以下几种 一.将图标换成icon字体管理 如果项目存在大量的图表用的 ...

  6. web字体库加载优化_优化Web字体以提高性能:最新技术

    web字体库加载优化 This article is part of a series created in partnership with SiteGround. Thank you for su ...

  7. 前端性能优化(一)用一张图说明加载优化

    本文从加载的角度写一下前端性能优化. 需要说明的是下面这种脑暴图是按照从第一象限和第四象限的顺序来看的. 一.加载体积优化 我们无法控制用户的网络状况,既然想加载速度快,那当然是能不加载就不加载,能少 ...

  8. Web 性能优化:使用 CSS font-display 控制字体加载和替换

    作者 | 张旭乾       责编 | 欧阳姝黎 出品 | 峰华前端工程师 在编写网站的时候,或多或少都会用到一些网络上的字体,CSS 3 中虽然加入了对 Web Fonts(网络字体)的支持,但是浏 ...

  9. 前端页面性能优化指标

    前端页面性能优化指标 一.有哪些指标 LCP(Largest Contentful Paint) FID( First Input Delay) CLS(Cumulative Layout Shift ...

最新文章

  1. 两次include一个文件的问题
  2. ActiveMQ网络连接
  3. [ lucene FAQ ] 当磁盘索引被IndexSearcher打开时,为什么优化操作后索引容量翻倍?...
  4. android https bks,如何将.cer转换为BKS
  5. Civil 3D 中使用COM API导入DEM数据创建曲面
  6. C++基础知识友元friend、友元函数和友元类
  7. asp.net Page.Controls对象(找到所有服务器控件)
  8. Magento: 添加first name 和 last name到newsletter Add additional fields to your newsl
  9. iPhone:创建、连接和使用静态库(过时了,仅参考)
  10. 【Java】利用for循环打印心型
  11. android中Adapter适配器的讲解
  12. java string 数组 个数,Java - 定义一个接收String的方法,并返回一个整数数组,其中包含每个元音的数量...
  13. 分布式存储---moosefs部署
  14. 温故知新----css基础
  15. java权限管理与用户角色权限设计
  16. java中三个基本框架_javaweb框架主要的三大基本框架是哪些?作用分别是什么?...
  17. ict的终极模式 是软件研发
  18. Ubuntu20.04安装网易云音乐播放器
  19. mixly自定义第三方库
  20. MySql 递归应用

热门文章

  1. 基于微信小程序的电影院订票选座小程序 系统的设计与实现 开题报告和效果图
  2. h p服务器如何装系统,联想拯救者R7000P 2020(R7-4800H) u盘pe如何重装win7系统
  3. eth 创建钱包,转账 web3j
  4. 惊蛰 | 春雷响,万物生
  5. linux config文件夹,[问题] .config文件在ubuntu的哪个文件夹中
  6. 信号塔是服务器吗,信号塔对于我们的用途
  7. 请你用严谨的数学语言证明一下庞加莱猜想
  8. 基于QT的指挥猫猫打架玩耍的小游戏设计
  9. 运用计算机怎么实现自动化,计算机在自动化中的应用
  10. [error]stack smashing detected