在响应式网站中,提升加载webfonts的性能(一)

news/2024/5/5 21:13:44/文章来源:https://blog.csdn.net/weixin_34417814/article/details/89473621

前言

因为 Arial, Verdana, Garamond or Times New Roman 这些字体几乎在所有电脑上都有安装,所以以前每个网站都使用他们来渲染文本。至今,虽然webfonts已经在互联网中得到普遍的使用,但是我们依然不知道如何高效的加载他们。

为了提供更好的用户体验,我写了一些怎么做才能高效加载webfonts的简单解决方法,这个方案的实施并不需要昂贵的硬件支持。

0. 目录

主要从以下方案进行介绍:

(1)使用woff字体格式(PS:可能是EOT和TTF格式默认情况下不会进行压缩,然而WOFF格式具有内建压缩,而且WOFF格式的支持很广泛的原因。);

(2)对于不支持webfonts的浏览器使用“web安全”字体(PS:使用前言中提到的一些几乎所有电脑都安装了的字体作为后备字体,保证用户能够正常浏览网页);

(3)下载字体的“二进制”格式,并且优化它;

(4)使用你自己的字体库;

(5)将字体进行base64编码后,存放于CSS文件中;

(6)如果用户本地没有网页请求的字体,那么就异步加载该字体,并且将该字体存储在localStorage中,以便第二次请求字体直接从localStorage中进行读取,避免字体加载带来的性能问题;

英文版本的作者 2014/10/09 更新内容

如果你不相信以上方案能够优化网页的性能,那么我创建了2个Demo页面。能够测试他们在:资源加载、资源阻塞以及其他方面的问题。

  1. Demo页面:从Google Fonts中加载字体

  2. Page Speed的测试:从Google Fonts中加载字体

  3. Demo页面:异步加载字体并且存储到localStorage中,第二次直接从localStorage中取出字体

  4. Page Speed的测试:异步加载字体并且存储到localStorage

页面访问截图

1. 浏览器支持程度

通过 caniuse 的统计,有84%用户的浏览器支持WOFF字体格式。除此之外,不支持WOFF格式的浏览器包括:IE8及其以下、Android上的一些老浏览器。因此,这里提供的优化是针对于支持WOFF字体格式的现代浏览器的方案。对于旧浏览器依然使用后备字体来展现网页(比如:Arial = = PS以下:中文的话可以采用“simsun”,属于衬线字体),这将给用户带来更好的用户体验。

2. 不要使用Google Fonts或者Typekit这类的外部链接方式

这两种方式会造成以下两个问题:

(1)额外的请求阻塞
(2)通过它们异步加载字体的时候会出现闪烁问题。

下面我们将看到处理webfonts更好的方式。

3. licence问题

选择一个webfonts自己使用。不幸的时没有任何一个licence允许这么干。不过值得庆幸的时我们可以利用一些开源的字体,比如:Open Sans、Source Sans Pro。当你发现你想要的字体就能够下载它们的“二进制”文件(OTF或者TTF)。

4. 优化、减小字体文件大小以及生成CSS文件

这里推荐一个网站:Font Squirrel Webfont Generator

(PS:这个网站是用来处理字体的,有捐赠环节的哦~具体功能可以点进去尝试一下就知道了)

我们能够选择一些额外的方式来移除一些字符。你能够选择你需要的一些字符出来使用。如果你的网页全是英文内容,那么你只需要选择一些基本字符;如果你得网页有中文,那么你可能需要所有的字符。(原文错误:Chineese -\> Chinese)

更重要的是最后生成我们所需要的,包含了字体base64编码信息的CSS字体文件。

5. 使用字体的CSS文件

该CSS文件的大小取决于你选择的字符集合以及相关方面,也许该文件相当的大(最高可达100~300KB)。因此,使用gzip压缩以及设置强缓存的方式对于用户来说是很重要的。

不过幸运的是只有当你网页的浏览者第一次访问该CSS文件的时候会发出请求。由于在第一次的时候,用户本地没有该字体文件,所以浏览器就会去异步加载他们,并且存储在localStorage中。当用户的网络环境较慢的情况下,能够看到后备字体以及webfonts渲染过程,不过这些只会发生在用户第一次访问你网页的时候。大多数用户不会太在意这一细节。

当用户第二次网页页面的时候,浏览器将从localStorage中加载CSS文件内容,这种方式相当的快速(5~50ms)。在这种情况下用户看不到任何的闪烁,因为所有的操作将是同步进行的,这仅仅只需要几毫秒的时间。

优化后的示例图

6. 展示一下代码的编写

由于我使用的是localStorage技术,所以只有客户端的代码。

(function(){function addFont() {var style = document.createElement('style');style.rel = 'stylesheet';document.head.appendChild(style);style.textContent = localStorage.sourceSansPro;}try {if (localStorage.sourceSansPro) {// 如果localStorage中有该字体,就直接取出来加载addFont();} else {// 首次加载字体我们需要异步加载它var request = new XMLHttpRequest();request.open('GET', '/path/to/source-sans-pro.woff.css', true);request.onload = function() {if (request.status >= 200 && request.status < 400) {// 保存到localStorage中,key=sourceSansProlocalStorage.sourceSansPro = request.responseText;addFont();}}request.send();}} catch(ex) {// 这里处理一些同步加载woff功能的浏览器// 避免当localStorage不可用的时候,那么将每次请求字体带来的闪烁问题}
}());

优化的流程图简图如下:

优化的流程图

7. 我们做到了什么

(1)解决了除用户第一次访问网页外,其余更多次访问时候的请求阻塞问题;

(2)解决了除用户第一次访问网页外,其余访问的闪烁问题;

(3)减少了第一次请求页面的渲染时间;

(4)得到了在Google Page Speed Insights 和 WebPageTest.org 上更高的分数。

8. 看看实际效果

英文版本的作者说到本文缺少一些细节的说明,能够在他博客中留言讨论。

英文版本的作者 2014/10/11 更新内容

通过内联Goole提供的CSS文件的方式,在Google Page Speed Insights中取得了99/100的分数。

英文版本的作者不赞同使用这种方式,因为这种方式会严重影响文本的渲染,因此我们来深入了解一下其中发生了什么。

(1)首先我们定义一个内联的font faces。

<head>
...
<style>@font-face {font-family: 'Source Sans Pro';font-style: normal;font-weight: 400;src: local('Source Sans Pro'),local('SourceSansPro-Regular'),url(http://fonts.gstatic.com/s/sourcesanspro/v9/ODelI1aHBYDBqgeIAH2zlBBHWFfxJXS04xYOz0jw624.woff) format('woff');}
</style>
...
</head>

(2)由于浏览器最开始不知道页面哪一个地方会使用到该字体,所以不会去请求这个字体文件。

(3)浏览器要等待DOM和CSSOM构建完成。

(4)浏览器这时开始从Google Fonts请求字体文件,需要注意的是,这里会有一个来自于fonts.gstatic.com的额外DNS请求(PS:在国内的环境就不要想google字体的事情了,可以使用360的公共CDN服务,很好用,改改URL就行)。

gfonts-timeline

这个timeline说明在DOMContentLoaded事件之前,字体的加载已经开始了。

(5)如果上面的前面还不够糟糕,大多数浏览器将呈现空白文本,在不同浏览器之间实际的行为会有所不同:

A. 如果请求字体还不可用,IE 会立即使用后备字体呈现,并在字体下载完成之后马上重新呈现;

B. Firefox 和 Chrome 35+ 会首先下载3秒钟的字体,如果超过3秒钟后,会使用后备字体渲染网页,等到指定字体下载完成后再重新渲染网页;

C. Safari 和 Chrome 35之前的版本,会等到指定字体下载完成后再渲染网页(PS:就是不会使用后备字体)。

注:以上说明中没有表示IE的版本以及Safari的版本号,所以需要自己测试才能算正确。

因此,如果网络连接缓慢,在大多数浏览器中将延迟超过3秒的文本渲染。在最坏的情况下,如果你的字体加载带有时间限制(由于一些连接很慢的移动设备),Safari 用户将不会再展示文本,剩下一个空白网页。如果网页请求超时,最终将只会呈现一个空白网页。

更多的信息可以访问:Ilya Gregorik's blog

其他相关资源:

  • Web Fonts Performance: Making Pretty, Fast - By Ilya Grigorik

  • Improving Smashing Magazine’s Performance: A Case Study

  • How we make RWD sites load fast as heck

其实英文版本的作者也是翻译的一篇俄文,这篇俄文来自于:

Russian by Максим Усачев

英文版本原文出自:

http://bdadam.com/blog/loading-webfonts-with-high-performance.html

注:如果你有兴趣可以再看一下英文版本和俄文版本文章下面的评论,里面还有一些很有价值的东西,这里就不再翻译了,有时间可以再整理一下。以上文章如果有翻译不恰当的地方请在文章后面留言,看见了一定回复并且修改。

原文出自:http://www.60sky.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_791542.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10 IIS本地部署网站运行时图片和样式不正常?

后期会在博客首发更新&#xff1a;http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 启用关闭win功能&#xff0c;开启一下静态内容 收工~ 转载于:https://www.cnblogs.com/dunitian/p/5359145.html

百度排名是否和网站服务器有关,网站换服务器是否会对百度排名有影响

网站换服务器&#xff0c;是否会对百度排名有影响&#xff1f;是有影响的&#xff1b;至于影响大不大要看你网站的现状&#xff1b;如果你网站是一个新的企业站&#xff0c;收录比较少&#xff0c;蜘蛛抓取频率很低&#xff0c;不经常访问&#xff1b;那影响是比较大的&#xf…

NGINX网站服务-LNMP平台及应用

实验需求&#xff1a;LNMP实现多个虚拟主机&#xff0c;部署wordpress和phpmyadmin&#xff0c;并为phpmyadmin提供https实验环境&#xff1a;LNMP CentOS 7.2x86_64 IP&#xff1a;172.16.251.138测试端 CentOS 6.7x86_64 …

奇奇seo优化软件_seo关键词优化软件哪家便宜

哪家便宜sj67745eo关键词优化软件&#xff0c;在SEO优化中&#xff0c;标题非常重要&#xff0c;因为标题是用户对企业网站的第一印象&#xff0c;也是用户在浏览网站文章前了解文章内容的窗口。通过文章标题&#xff0c;用户可以判断文章是否需要继续浏览。而且&#xff0c;网…

wordpress 通过域名无法访问_宝塔面板之创建WordPress网站

今天来说一下安装好面板以后如何创建站点&#xff0c;域名解析这里就不说了&#xff0c;非常基础的东西了…1、创建站点2、设置伪静态3、上传网站程序创建好站点以后需要上传网站程序&#xff0c;可以在宝塔面板上面上传&#xff0c;也可以登录SFTP上传网站程序&#xff0c;SFT…

网站目录防篡改程序,perl web目录md5文件验证

为什么80%的码农都做不了架构师&#xff1f;>>> 有时候站点有bug&#xff0c;很容易会被人修改&#xff0c;添加其他乱七八糟的东西&#xff0c;针对这类问题&#xff0c;常见的做法&#xff1a;1、修改升级程序漏洞。2、用WAF主动防御&#xff08;用第三方免费cdn…

使用Apache搭建Web网站服务器

使用Apache搭建Web网站服务器 一&#xff1a;实验目标 apache服务器常见概念 apache服务器安装及相关配置文件 例1&#xff1a;为公司内网搭建一个web服务器 例2&#xff1a;使用rpm搭建lamp 环境 例3&#xff1a;修改网根目录及对应参数&#xff0c;设置访问权限 例4,&#xf…

如何写接口可以让对方通过接口推送数据代码示例_SEO优化之百度主动推送链接...

本节来说下seo里面的链接问题&#xff0c;为了让我们最近更新的文章尽快被百度收录&#xff0c;以前都是人为的去百度搜索引擎上面提交链接&#xff0c;让蜘蛛过来抓取&#xff0c;后期百度也出了一个接口(暂叫它接口)&#xff1a;百度资源搜索平台-链接提交&#xff0c;共有&a…

woocommerce产品选项描述修改_WooCommerce跨境电商独立站建站教程2020版

跨境电商独立站怎么搭建&#xff1f;WooCommerce跨境电商独立站建站是怎么回事&#xff1f;这篇文章苦心孤译就跟你分享如何在WordPress上利用WooCommerce搭建一个跨境电商独立站。人在东南亚&#xff0c;网络实在不怎么样&#xff0c;图片比较多。大家可以点击下方链接阅读原文…

高性能网站设计之缓存更新的套路

看到好些人在写更新缓存数据代码时&#xff0c;先删除缓存&#xff0c;然后再更新数据库&#xff0c;而后续的操作会把数据再装载的缓存中。然而&#xff0c;这个是逻辑是错误的。试想&#xff0c;两个并发操作&#xff0c;一个是更新操作&#xff0c;另一个是查询操作&#xf…

大型网站--负载均衡架构

负载均衡 &#xff08;Load Balancing&#xff09; 负载均衡建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。大型网站负载均衡的利器全局负载均衡系统&#xff0…

织梦index.php被黑,织梦网站被黑的解决流程

织梦网站安全问题一直以来都是令人堪忧的&#xff0c;不过毕竟是开源程序&#xff0c;可以理解。这不最近有一位同学的站点就“中招”了&#xff0c;下面阿南就把处理的流程记录下来&#xff0c;希望对站长们有帮助。首先打开站点首页&#xff0c;我们可以看到&#xff0c;标题…

划重点!必备 SQL 查询优化技巧,提升网站访问速度

来自&#xff1a;开源中国 协作翻译链接&#xff1a;oschina.net/translate/sql-query-optimization原文&#xff1a;https://deliciousbrains.com/sql-query-optimization/译者&#xff1a;南宫冰郁, rever4433, soaring, 凉凉_, Tony, 无若在这篇文章中&#xff0c;我将介绍如…

AcFun网站已无法打开:官微表达无奈

IT之家2月2日消息 目前著名的弹幕网站AcFun中的视频已经无法播放&#xff0c;同时经过多地网友测试&#xff0c;AcFun的网站也已经无法打开&#xff0c;官微也发表微博&#xff0c;似乎表达对于网站无法打开的无奈。经过IT之家的测试&#xff0c;目前AcFun网站已经无法打开&…

大型网站限流算法的实现和改造

最近写了一个限流的插件&#xff0c;所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法分析之前依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口&#xff0c;那么我的限流插件就应该能针对每一个接口就行…

高级Java开发人员最常访问的几个网站

这是高级Java开发人员最常访问的几个网站。 这些网站提供新闻&#xff0c;一般问题或面试问题的答案&#xff0c;精彩的讲座等。质量是优秀网站的关键因素&#xff0c;这此网站都有较高的质量内容。下面逐一介绍&#xff1a;1. StackoverflowStackoverflow.com可能是编程世界中…

高级Java开发人员最常访问的几个网站

这是高级Java开发人员最常访问的几个网站。 这些网站提供新闻&#xff0c;一般问题或面试问题的答案&#xff0c;精彩的讲座等。质量是优秀网站的关键因素&#xff0c;这此网站都有较高的质量内容。下面逐一介绍&#xff1a;1. StackoverflowStackoverflow.com可能是编程世界中…

大型网站系统架构的演化

四、使用集群改善应用服务器性能应用服务器作为网站的入口&#xff0c;会承担大量的请求&#xff0c;我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求&#xff0c;根据分发策略将请求分发到多个应用服务器节点。常用的负载均衡技术硬件…

JavaWeb之ServletContext——统计用户访问网站次数

各位小伙伴大家好呀~今天我们来了解 ServletContext 对象ServletContext 对象1&#xff09;什么是 ServletContext 对象ServletContext 代表是一个 web 应用的环境&#xff08;上下文&#xff09;对象,ServletContext对象内部封装是该 web 应用的信息&#xff0c;一个 web 应用…

一个大型网站的技术架构是怎样建成的

网站系统架构层次如下图所示&#xff1a;1.前端架构前端指用户请求到达网站应用服务器之前经历的环节&#xff0c;通常不包含网站业务逻辑&#xff0c;不处理动态内容。浏览器优化技术并不是优化浏览器&#xff0c;而是通过优化响应页面&#xff0c;加快浏览器页面的加载和显示…