必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

前端的性能对于一个Web应用来说非常重要必威,

2019-09-21 03:00 来源:未知

快速提升前端性能

2015/09/26 · HTML5, JavaScript · 1 评论 · 性能

本文由 伯乐在线 - cucr 翻译,唐尤华 校稿。未经许可,禁止转载!
英文出处:Jonathan Suh。欢迎加入翻译组。

去年,我写了一篇文章Need for Speed,分享了在开发我的网站中使用的工作流程和技术(包含工具)。从那时起,我的网站又经过了一次重构,完成了很多工作流程和服务器端改进,同时我对前端性能也给与了额外关注。以下就是我做的工作,为什么我要这么做,以及我在网站上用来优化前端性能的工具。

今天看的是之前保存的一篇前端优化的相关文章。但是人家写了禁止转载,我这边学习的话就不抄太多东西了。

Web前端优化最佳实践及工具集锦
发表于2013-09-23 19:47| 34107次阅读| 来源Googe & Yahoo| 124 条评论| 作者王果 编译
Web优化
Google
雅虎
PageSpeed
YSlow
摘要:前端的性能对于Web应用的用户体验来说非常重要。不要以为你的Web应用的性能已经足够好了,其实还会有很多可以提升的地方。本文将介绍Google和雅虎关于前端优化的最佳实践以及工具,你可以逐一检验你的Web应用。
前端的性能对于一个Web应用来说非常重要,如果一个Web应用的页面加载速度非常快、对于用户的操作可以及时响应,那么产品的用户体验将会极大地提升。下图显示了页面加载速度对于用户体验的影响。

Web前端优化最佳实践及工具集锦

2015/03/11 · JavaScript · Web开发, 工具

原文出处: CSDN 王果 编译整理   

前端的性能对于一个Web应用来说非常重要,如果一个Web应用的页面加载速度非常快、对于用户的操作可以及时响应,那么产品的用户体验将会极大地提升。下图显示了页面加载速度对于用户体验的影响。

必威 1

你的Web页面的速度是否已经足够快了?其实可能还有很多可以提升的地方。Google和雅虎也提出了一些Web应用的前端优化建议,并发布了一些工具,你可以逐一检验你的Web应用,以便达到更高的性能。

这些优化不仅仅可以给用户提供更好的体验,从开发者角度来说,进行优化还可以减少页面的请求数、降低请求所占的带宽、减少资源的浪费。

下面来看看Google和雅虎提供的Web页面优化最佳实践。

关键 CSS 和 Webpack : 减少阻塞渲染的 CSS 的自动化解决方案

2017/10/12 · CSS · webpack

原文出处: Anthony Gore   译文出处:iKcamp   

必威 2“消除阻塞渲染的CSS和JavaScript”。 这一条Google Page Speed Insights的建议总让我困惑。当一个网页被访问时,Google希望它仅加载对初始视图有用的内容,并使用空闲时间来加载其他内容。这种方式可以使用户尽可能早地看到页面。

必威 3

我们可以做很多事情来减少阻塞渲染的JavaScript,例如code splitting、tree shaking,缓存等。

但是如何减少阻塞渲染的CSS?为此,可以拆分并优先加载首次渲染所需要的CSS(关键CSS),然后再加载其它CSS。

可以通过编程的方式筛选出关键CSS,在本文中,我将向你展示如何通过Webpack的自动化流程来实现该方案。

最小化请求

所有在你的网站加载时用来渲染页面(外部CSS或JS文件、web字体、图片等等)的资源,都是不同的HTTP请求。一般的网站平均有 93个请求!

我的目标是减少HTTP请求。一种方法是分别编译或连接(组合、合并)CSS和javascript到一个文件中。让这个过程自动化(例如使用构建工具 Grunt 或 Gulp)是理想的效果,但至少也应该在生产环境下手动完成。

第三方脚本是增加额外请求最常见的罪魁祸首,很多获取额外的文件如脚本、图像或CSS的请求都不止1个。浏览器内置的开发者工具可以帮助你发现这些元凶。

必威 4
Google Chrome开发者工具的网络选项卡

例如,Facebook的脚本发起3次请求。测试环境中使用一些来自著名社交网站的社交分享脚本,可以看到他们快速增加:

站点 文件 大小
Google+ 1 15.1KB
Facebook 3 73.3KB
LinkedIn 2 47.7KB
Pinterest 3 12.9KB
Tumblr 1 1.5KB
Twitter 4 52.7KB
Total 14 203.2KB

来源:更有效的社会分享链接

这有额外的14个HTTP请求,共203.2KB。相反,我看看 “share-intent” 这个url,它基本上是通过传递和构建数据来生成一个共享,可以只使用HTML来创建社交共享链接。它让我丢掉用于共享的第三方脚本,这些脚本需要7次请求。我在Responsible Social Share Links这篇文章有更多的阐述。

评估每一个第三方脚本并确定其重要性。也许存在一种不依赖第三方的方法来完成它。你可能会失去一些功能(例如like、tweet、分享数量),但是请问一下自己:“像数量统计就那么重要吗?”

文章是这篇 快速提升前端性能。

你的Web页面的速度是否已经足够快了?其实可能还有很多可以提升的地方。Google和雅虎也提出了一些Web应用的前端优化建议,并发布了一些工具,你可以逐一检验你的Web应用,以便达到更高的性能。
这些优化不仅仅可以给用户提供更好的体验,从开发者角度来说,进行优化还可以减少页面的请求数、降低请求所占的带宽、减少资源的浪费。
下面来看看Google和雅虎提供的Web页面优化最佳实践。
一、Google的Web优化最佳实践

一、Google的Web优化最佳实践

1.  避免坏请求

有时页面中的HTML或CSS会向服务器请求一个不存在的资源,比如图片或HTML文件,这会造成浏览器与服务器之间过多的往返请求,类似于:

  • 浏览器:“我需要这个图像。”
  • 服务器:“我没有这个图像。”
  • 浏览器:“你确定吗?这个文档说你有。”
  • 服务器:“真的没有。”

必威 5

如此一来,会降低页面的加载速度。因此,检查页面中的坏链接非常有必要,你可以通过 Google的PageSpeed工具 来检测,找到问题后,补充相应的资源文件或者修改资源的链接地址即可。

2.  避免CSS @import

使用 @import方法引用CSS文件可以能会带来一些影响页面加载速度的问题,比如导致文件按顺序加载(一个加载完后才会加载另一个),而无法并行加载。

你可以使用 CSS delivery工具 来检测页面代码中是否存在@import方法。比如,如果检测结果中存在

CSS

@import url("style.css")

1
@import url("style.css")

则建议你使用下面的代码来替代。

XHTML

<link rel="style.css" href="style.css" type="text/css">

1
<link rel="style.css" href="style.css" type="text/css">

3.  避免使用document.write

在JavaScript中,可以使用 document.write在网页上显示内容或调用外部资源,而通过此方法,浏览器必须采取一些多余的步骤——下载资源、读取资源、运行JavaScript来了解需要做什么,调用其他资源时需要重新再执行一次这个过程。由于浏览器之前不知道要显示什么,所以会降低页面加载的速度。

要知道,任何能够被document.write调用的资源,都可以通过HTML来调用,这样速度会更快。检查你的页面代码,如果存在类似于下面的代码:

JavaScript

document.write('<script src="another.js"></script>');

1
document.write('<script src="another.js"></script>');

建议修改为:

XHTML

<script src="another.js"></script>

1
<script src="another.js"></script>

4.  合并多个外部CSS文件

在网站中每使用一个CSS文件,都会让你的页面加载速度慢一点点。如果你有一个以上的CSS文件,你应该将它们合并为一个文件。

你可以通过  CSS delivery工具 来检测页面代码中的CSS文件,然后通过复制粘贴的方式将它们合并为一个。合并后记得修改页面中的引用代码,并删除旧的引用代码。

必威 6

5.  合并多个外部JavaScript文件

大部分情况下,网站往往会包含若干个 JavaScript文件,但并不需要将这些文件都独立出来,其中有些是可以合并为一个文件的。

你可以通过 resource check工具 来检测页面中所引用的JavaScript文件数,然后可以通过复制粘贴的方式将多个文件合并为一个。

6.  通过CSS sprites来整合图像

如果页面中有6个小图像,那么浏览器在显示时会分别下载。你可以通过CSS sprites将这些图像合并成1个,可以减少页面加载所需的时间。

CSS sprites需要有两个步骤:整合图像、定位图像。比如你可以通过下面的代码来分别定位下面图像中的上下两部分。

CSS

.megaphone {width:50px; height:50px; background:url(images/sprite.png) 0 0px;} .smile {width:50px; height:50px; background:url(images/sprite.png) 0 -50px;}

1
2
.megaphone {width:50px; height:50px; background:url(images/sprite.png) 0 0px;}
.smile {width:50px; height:50px; background:url(images/sprite.png) 0 -50px;}

必威 7

7. 延迟JavaScript的加载

浏览器在执行JavaScript代码时会停止处理页面,当页面中有很多JavaScript文件或代码要加载时,将导致严重的延迟。尽管可以使用defer、异步或将JavaScript代码放到页面底部来延迟JavaScript的加载,但这些都不是一个好的解决方案。

下面是Google的建议。

JavaScript

<script type="text/javascript"> function downloadJSAtOnload() { var element = document.createElement("script"); element.src = "defer.js"; document.body.appendChild(element); } if (window.addEventListener) window.addEventListener("load", downloadJSAtOnload, false); else if (window.attachEvent) window.attachEvent("onload", downloadJSAtOnload); else window.onload = downloadJSAtOnload; </script>

1
2
3
4
5
6
7
8
9
10
11
12
<script type="text/javascript">
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "defer.js";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>

这段代码的意思是等待页面加载完成后,然后再加载外部的“defer.js”文件。下面是测试结果。

必威 8

8.  启用压缩/ GZIP

使用gzip对HTML和CSS文件进行压缩,通常可以节省大约50%到70%的大小,这样加载页面只需要更少的带宽和更少的时间。

你可以通过这个 Gzip压缩工具 来检测页面是否已经经过Gzip压缩。

9.  启用Keep-Alive

HTTP协议采用“请求-应答”模式,当使用普通模式(非KeepAlive模式)时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用 Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

在HTTP 1.0中Keep-Alive默认是关闭的,需要在HTTP头中加入“Connection: Keep-Alive”,才能启用Keep-Alive;在 HTTP1.1中Keep-Alive默认启用,加入“Connection: close”可关闭。目前大部分浏览器都是用HTTP 1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看Web服务器的设置情况。

10.  将小的CSS和JavaScript代码内嵌到HTML中

如果你的CSS代码比较小,可以将这部分代码放到HTML文件中,而不是一个外部CSS文件,这样可以减少页面加载所需的文件数,从而加快页面的加载。同样,也可以将小的 JavaScript脚本代码内嵌到HTML文件中。

XHTML

<style type="text/css"> <!--CSS代码--> </style> <script type="text/javascript"> <!--JavaScript代码--> </script>

1
2
3
4
5
6
7
<style type="text/css">
<!--CSS代码-->
</style>
 
<script type="text/javascript">
<!--JavaScript代码-->
</script>

11.  利用浏览器缓存

在显示页面时,浏览器需要加载logo、CSS文件和其他一些资源。浏览器缓存所做的工作就是“记住”已经加载的资源,让页面的加载速度更快。

12.  压缩CSS代码

不管你在页面中如何使用CSS,CSS文件都是越小越好,这会帮助你提升网页的加载速度。你可以通过 Minify CSS工具 来压缩你的CSS代码。

压缩前:

CSS

body { background-color:#d0e4fe; } h1 { color:orange; text-align:center; }

1
2
3
4
5
6
7
8
9
body
{
background-color:#d0e4fe;
}
h1
{
color:orange;
text-align:center;
}

压缩后:

CSS

body {background-color:#d0e4fe;} h1 {color:orange;text-align:center;}

1
2
body {background-color:#d0e4fe;}
h1 {color:orange;text-align:center;}

13.  尽量减少DNS查询次数

当浏览器与Web服务器建立连接时,它需要进行DNS解析,将域名解析为IP地址。然而,一旦客户端需要执行DNS lookup时,等待时间将会取决于域名服务器的有效响应的速度。

虽然所有的ISP的DNS服务器都能缓存域名和IP地址映射表,但如果缓存的DNS记录过期了而需要更新,则可能需要通过遍历多个DNS节点,有时候需要通过全球范围内来找到可信任的域名服务器。一旦域名服务器工作繁忙,请求解析时就需要排队,则进一步延迟等待时间。

因此,减少DNS的查询次数非常重要,页面加载时就尽量避免额外耗时。为了减少DNS查询次数,最好的解决方法就是在页面中减少不同的域名请求的机会。

你可以通过 request checker工具 来检测页面中存在多少请求,然后进行优化。

14.  尽量减少重定向

有时为了特定需求,需要在网页中使用重定向。重定向的意思是,用户的原始请求(例如请求A)被重定向到其他的请求(例如请求B)。

但是这会造成网站性能和速度下降,因为浏览器访问网址是一连串的过程,如果访问到一半而跳到新地址,就会重复发起一连串的过程,这将浪费很多的时间。所以我们要尽量避免重定向,Google建议:

  • 不要链接到一个包含重定向的页面
  • 不要请求包含重定向的资源

15.  优化样式表和脚本的顺序

Style标签和样式表调用代码应该放置在JavaScript代码的前面,这样可以使页面的加载速度加快。

XHTML

<head> <meta name=description content="description"/> <title>title</title> <style> page specific css code goes here </style> <script type="text/javascript"> javascript code goes here </script> </head>

1
2
3
4
5
6
7
8
9
10
<head>
<meta name=description content="description"/>
<title>title</title>
<style>
page specific css code goes here
</style>
<script type="text/javascript">
javascript code goes here
</script>
</head>

16.  避免JavaScripts阻塞渲染

浏览器在遇到一个引入外部JS文件的<script>标签时,会停下所有工作来下载并解析执行它,在这个过程中,页面渲染和用户交互完全被阻塞了。这时页面加载就会停止。

谷歌 建议 删除干扰页面中第一屏内容加载的JavaScript,第一屏是指用户在屏幕中最初看到的页面,无论是桌面浏览器、手机,还是平板电脑。

必威 9

17.  缩小原始图像

如果无需在页面中显示较大的图像,那么就建议将图像的实际大小缩小为显示的大小,这样可以减少下载图像所需的时间。

18.  指定图像尺寸

当浏览器加载页面的HTML代码时,有时候需要在图片下载完成前就对页面布局进行定位。如果HTML里的图片没有指定尺寸(宽和高),或者代码描述的尺寸与实际图片的尺寸不符时,浏览器则要在图片下载完成后再“回溯”该图片并重新显示,这将消耗额外的时间)。

所以,最好为页面中的每一张图片都指定尺寸,不管是在HTML里的<img>标签中,还是在CSS中。

更多信息: 

什么是阻塞渲染

如果资源是“阻塞渲染”的,则表示浏览器在资源下载或处理完成之前不会显示该页面。

通常,我们在html的head标签中添加CSS样式表,这种方式会阻塞渲染,如下所示:

JavaScript

<head> <link rel="stylesheet" href="/style.css"> ...</head><body> <p>在style.css下载完之前,你看不到我!!!</p></body>

1
2
3
4
<head>
  <link rel="stylesheet" href="/style.css">
  ...</head><body>
  <p>在style.css下载完之前,你看不到我!!!</p></body>

当这个html页面被网络浏览器加载时,它将从上到下被逐行解析。当浏览器解析到link标签时,它将立即开始下载CSS样式表,在完成之前不会渲染页面。

对于一个大型网站,尤其是像使用了Bootstrap这种庞大框架的网站,样式表有几百KB,用户必须耐心等待其完全下载完才能看到页面。

那么,我们是否应该把link标签放到body中,以防止阻塞渲染?你可以这么做,但是阻塞渲染也不是全无优点,我们实际上可以利用它。如果页面渲染时没有加载任何CSS,我们会遇到丑陋的”内容闪现”。

必威 10

我们想要的完美解决方案就应该是:首屏相关的关键CSS使用阻塞渲染的方式加载,所有的非关键CSS在首屏渲染完成后加载。

压缩、优化

现在我找到了减少请求的方法,我开始寻找各种方法来减重。文件越小,加载速度越快。通常平均的页面大小为1950KB。按照内容分类:

图片:1249KB HTML:58KB CSS:60KB JS:303KB 字体:87KB Flash:67KB 其它:126KB

我使用这些数据作为参考和比较的起点,同时找到我可以用来为网站减负的方法。 我的网站耗费的流量有多少?是一个由Tim Kadlec编写的很棒的工具,可以用来帮助你测试和可视化,来自世界各地的访问在你的网站上消耗的流量。

文章主要介绍了如下一些需要关注的点:

  1. 避免坏请求
    有时页面中的HTML或CSS会向服务器请求一个不存在的资源,比如图片或HTML文件,这会造成浏览器与服务器之间过多的往返请求,类似于:

二、雅虎的Web优化最佳实践

1.  内容优化

  • 尽量减少HTTP请求:常见方法包括合并多个CSS文件和JavaScript文件,利用CSS Sprites整合图像,Image map(图像中不同的区域设置不同的链接),内联图象(使用  data: URL scheme 在实际的页面嵌入图像数据)等。
  • 减少DNS查找
  • 避免重定向
  • 使Ajax可缓存
  • 延迟加载组件:考虑哪些内容是页面呈现时所必需首先加载的、哪些内容和结构可以稍后再加载,根据这个优先级进行设定。
  • 预加载组件:预加载是在浏览器空闲时请求将来可能会用到的页面内容(如图像、样式表和脚本)。当用户要访问下一个页面时,页面中的内容大部分已经加载到缓存中了,因此可以大大改善访问速度。
  • 减少DOM元素数量:页面中存在大量DOM 元素,会导致JavaScript遍历DOM的效率变慢。
  • 根据域名划分页面内容:把页面内容划分成若干部分可以使你最大限度地实现平行下载。但要确保你使用的域名数量在2个到4个之间(否则与第2条冲突)。
  • 最小化iframe的数量:iframes 提供了一个简单的方式把一个网站的内容嵌入到另一个网站中。但其创建速度比其他包括JavaScript和CSS的DOM元素的创建慢了1-2个数量级。
  • 避免404:HTTP请求时间消耗是很大的,因此使用HTTP请求来获得一个没有用处的响应(例如404没有找到页面)是完全没有必要的,它只会降低用户体验而不会有一点好处。

2. 服务器优化

  • 使用内容分发网络(CDN):把你的网站内容分散到多个、处于不同地域位置的服务器上可以加快下载速度。
  • 添加Expires或Cache-Control信息头:对于静态内容,可设置文件头过期时间Expires的值为“Never expire(永不过期)”;对于动态内容,可使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求。
  • Gzip压缩
  • 设置ETag:ETags(Entity tags,实体标签)是web服务器和浏览器用于判断浏览器缓存中的内容和服务器中的原始内容是否匹配的一种机制。
  • 提前刷新缓冲区:当用户请求一个页面时,服务器会花费200到500毫秒用于后台组织HTML文件。在这期间,浏览器会一直空闲等待数据返回。在PHP中,可以使用flush()方法,它允许你把已经编译的好的部分HTML响应文件先发送给浏览器,这时浏览器就会可以下载文件中的内容(脚本等)而后台同时处理剩余的HTML页面。
  • 对Ajax请求使用GET方法:当使用XMLHttpRequest时,浏览器中的POST方法会首先发送文件头,然后才发送数据。因此使用GET最为恰当。
  • 避免空的图像src

3. Cookie优化

  • 减小cookie大小:去除不必要的coockie,并使coockie体积尽量小以减少对用户响应的影响
  • 针对Web组件使用域名无关的Cookie:对静态组件的Cookie读取是一种浪费,使用另一个无Cookie的域名来存放静态组件是一个好方法,或者也可以在Cookie中只存放带www的域名。

4. CSS优化

  • 将CSS代码放在HTML页面的顶部
  • 避免使用CSS表达式:CSS表达式在执行时候的运算量非常大,会对页面性能产生大的影响
  • 使用<link>来代替@import
  • 避免使用Filters:IE独有属性AlphaImageLoader用于修正IE 7以下版本中PNG图片的半透明效果,但它的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。

5. JavaScript优化

  • 将JavaScript脚本放在页面的底部
  • 将JavaScript和CSS作为外部文件来引用:在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓存。
  • 缩小JavaScript和CSS
  • 删除重复的脚本
  • 最小化DOM的访问:使用JavaScript访问DOM元素比较慢
  • 开发智能的事件处理程序

6. 图像优化

  • 优化图片大小
  • 通过CSS Sprites优化图片
  • 不要在HTML中使用缩放图片
  • favicon.ico要小而且可缓存

7. 针对移动优化

  • 保持组件大小在25KB以下:主要是因为iPhone不能缓存大于25K的文件(注意这里指的是解压缩后的大小)。
  • 将组件打包成为一个复合文档:把页面内容打包成复合文本就如同带有多附件的Email,它能够使你在一个HTTP请求中获取多个组件。

更多信息:(中文翻译)

关键CSS

这里是我用Webpack和Bootstrap编写的一个简单的网页, 下面的截图是首次渲染后的样式。

必威 11

点击Sign Up today按钮会弹出一个模态框, 模态框弹出时的样式如下:

必威 12

首次渲染需要的样式包括导航条的样式、超大屏幕样式、按钮样式、其它布局和字体的公用样式。但是我们并不需要模态框的样式,因为它不会立即在页面中显示。考虑到这些,下面是我们拆分关键CSS和非关键CSS的可能的方式:

critical.css

.nav { ... } .jumbtron { ... } .btn { ... }

1
2
3
4
5
6
7
8
9
10
11
.nav {
  ...
}
 
.jumbtron {
  ...
}
 
.btn {
  ...
}

non_critical.css

.modal { ... }

1
2
3
.modal {
  ...
}

如果你已经有这个概念,那么你可能会提出两个疑问:

  1. 我们如何用程序区分关键CSS和非关键CSS?
  2. 如何让页面在首次渲染之前加载关键CSS,之后加载非关键CSS?

CSS和JavaScript

压缩样式表和JavaScript文件可以明显减少文件大小,我仅在压缩上就从一个文件上节省了56%的空间。

压缩前 压缩后 节省比例
CSS 135KB 104KB 23.0%
JS 16KB 7KB 56.3%

我使用 BEM (代码、元素、修饰符) 方法论编写CSS,这将导致冗长的类名。重构我的一些代码变得更简短(“navigation”为 “nav”, “introduction” 为 “intro”),这让我节省了一些空间,但和我期望的后期压缩相比并不是那么明显。

冗长的类 精简后 节省比例
104KB 97KB 6.7%

我也重新评估了使用jQuery的必要性。对于压缩的135KB的JavaScript,大约96KB是jQuery库——71%之多!这里并没有很多需要依赖于jQuery,所以我花时间重构了代码。我通过剥离jQuery和在Vanilla重写它,去除了122KB,最终压缩后的文件大小减少到13KB。

jQuery Vanilla JS 节省比例
135KB 13KB 122KB (90%)

从那时起,我设法去掉更多空间(压缩后7KB),最后脚本在压缩和gzipped后只有0.365KB。

1、最小化请求

这个是说一般的页面中发的请求过多,会导致页面打开速度变慢。
解决的一种方法是分别编译或连接(组合、合并)CSS和javascript到一个文件中。让这个过程自动化(Grunt 或者 Gulp)是理想的效果,但至少也应该在生产环境下手动完成。

第三方脚本是增加额外请求最常见的罪魁祸首,很多获取额外的文件如脚本、图像或CSS的请求都不止1个。

浏览器:“我需要这个图像。”
服务器:“我没有这个图像。”
浏览器:“你确定吗?这个文档说你有。”
服务器:“真的没有。”

三、一些工具

1.  Google PageSpeed

Google提供了 PageSpeed工具,这是一个浏览器插件,可以很好地应用上文中Google所提到的Web优化实践——帮助你轻松对网站的性能瓶颈进行分析,并为你提供优化建议。

  • 在线分析你的网站
  • 安装浏览器插件( Chrome、 Firefox)
  • 通过 Insights API在应用中嵌入PageSpeed功能

2.  雅虎 YSlow

YSlow是雅虎推出的一款浏览器插件,可以帮助你对网站的页面进行分析,并为你提供一些优化建议,以提高网站的性能。

  • Firefox插件
  • Chrome插件
  • YSlow for Mobile/Bookmarklet
  • 源码

3. 其他分析优化工具

  • 蜘蛛模拟器:这个工具可以分析你的页面,并提供一些优化建议。
  • 图像SEO工具:这个工具可以检查图片的alt标签,并提供一些优化建议。
  • 请求检查器:找出页面中需要加载哪些资源和服务。
  • 链接检查器:检查页面中内部、外部和无效链接。
  • HTTP头检查:显示网页或资源的HTTP响应头。
  • 社交检查器:检查页面中的社交组件,比如Google+、Facebook、Twitter、Linkedin和Pinterest。
  • If modified检查器:检查页面是否接受 If-Modified-Since HTTP头。
  • Gzip检查器:检查页面是否经过了Gzip压缩。
  • CSS delivery工具:检查页面中所使用的CSS文件。
  • 面包屑工具:可根据你输入的信息提供面包屑导航的代码。
  • CSS压缩工具:用于压缩CSS代码。

通过以上的优化建议和优化工具,可以轻松找到影响你的Web页面性能的瓶颈,轻松实现Web页面性能的提升。如果你也有Web优化方面的经验,欢迎分享。

赞 3 收藏 评论

必威 13

示例项目

我将简要介绍一下这个项目的基本配置,这样我们在遇到解决方案时,方便快速消化。
首先, 在入口文件中引入Bootsrap SASS。

main.js

require("bootstrap-sass/assets/stylesheets/_bootstrap.scss");

1
require("bootstrap-sass/assets/stylesheets/_bootstrap.scss");

我使用sass-loader来处理sass,与Extract Text Plugin一起使用,将编译出来的css放到单独的文件中。

使用HTML Webpack Plugin来创建一个HTML文件,它引入编译后的CSS。这在我们的解决方案中是必需的,你马上就会看到。

webpack.config.js

module.exports = { module: { rules: [ { test: /.scss$/, use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: ['css-loader', 'sass-loader'] }) }, ... ] }, ... plugins: [ new ExtractTextPlugin({ filename: 'style.css' }), new HtmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: true }) ] };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module.exports = {
  module: {
    rules: [
      {
        test: /.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: ['css-loader', 'sass-loader']
        })
      },
      ...
    ]
  },
  ...
  plugins: [
    new ExtractTextPlugin({ filename: 'style.css' }),
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    })
  ]
};

运行构建之后,这里是HTML文件的样子。请注意,CSS文件在head标签里引入,因此将会阻塞渲染。

index.html

JavaScript

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>vuestrap-code-split</title> <link href="/style.css" rel="stylesheet"> </head> <body> <!--App content goes here, omitted for brevity.--> <script type="text/javascript" src="/build_main.js"></script> </body> </html>

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>vuestrap-code-split</title>
    <link href="/style.css" rel="stylesheet">
</head>
<body>
  <!--App content goes here, omitted for brevity.-->
  <script type="text/javascript" src="/build_main.js"></script>
</body>
</html>

图片

图片通常占到一个网站的大头。通常网站平均有1249 KB的图片。

我抛弃了图标字体,取而代之的是内联SVG。此外,任何可以矢量化的图片都使用内联SVG替换。我的网站先前版本的一个页面仅仅图标web字体就加载了145KB,同时对于几百个web字体,我只使用了一小部分。相比之下,当前网站的一个页面只加载10KB内联SVG,这可是93%的差异。

SVG sprites看起来很有趣,它可能是我在整个网站使用普通内联SVG图标的一个可行的替代解决方案。

在可能的情况下使用CSS代替图片,现在的CSS能做的已经很多了。然而,浏览器兼容性可能是现代CSS使用的一个问题;因此,充分利用 caniuse.com 和逐步改进。

你也可以通过优化图片来压缩字节。有两种方法来优化图片:

  1. 有损压缩:降低图像的质量
  2. 无损压缩:不影响质量

要同时使用两种方法取得最好的效果,顺序是很重要的。首先使用有损图像压缩方法,比如在不超过必要大小的情况下调整图像大小然后在略低质量且不压缩太多的情况下导出如我通常在82 – 92%下导出JPG图片

必威 14

ImageOptim是OS X下的一个图像优化工具

接下来,使用无损图像优化工具比如 ImageOptim进行处理,从而通过删除不必要的信息,如元数据或颜色配置文件来进一步减少图像文件大小。

2、压缩、优化

现在找到了减少请求的方法,然后就可以开始寻找各种方法来减重。文件越小,加载速度越快。

如此一来,会降低页面的加载速度。因此,检查页面中的坏链接非常有必要,你可以通过 Google的PageSpeed工具 来检测,找到问题后,补充相应的资源文件或者修改资源的链接地址即可。

编程识别关键CSS

手动区分关键CSS维护起来会非常痛苦。以编程方式来实现的话,我们可以使用Addy Osmani的Critical。这是一个Node.js模块,它将读入HTML文档,并识别关键CSS。Critical能做的还不止这些,你很快就能体会到。

Critical识别关键CSS的方式如下:指定屏幕尺寸并使用PhantomJS加载页面,提取在渲染页面中用到的所有CSS规则。

以下为对项目的设置:

const critical = require("critical"); critical.generate({ /* Webpack打包输出的路径 */ base: path.join(path.resolve(__dirname), 'dist/'), src: 'index.html', dest: 'index.html', inline: true, extract: true, /* iPhone6的尺寸,你可以按需要修改 */ width: 375, height: 565, /* 确保调用打包后的JS文件 */ penthouse: { blockJSRequests: false, } });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const critical = require("critical");
 
critical.generate({
  
  /* Webpack打包输出的路径 */
  base: path.join(path.resolve(__dirname), 'dist/'),
  src: 'index.html',
  dest: 'index.html',
  inline: true,
  extract: true,
 
  /* iPhone6的尺寸,你可以按需要修改 */
  width: 375,
  height: 565,
  
  /* 确保调用打包后的JS文件 */
  penthouse: {
    blockJSRequests: false,
  }
});

执行时,会将Webpack打包输出文件中HTML更新为:

JavaScript

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Bootstrap Critical</title> <style type="text/css"> /* 关键CSS通过内部样式表方式引入 */ body { font-family: Helvetica Neue,Helvetica,Arial,sans-serif; font-size: 14px; line-height: 1.42857; color: #333; background-color: #fff; } ... </style> <link href="/style.96106fab.css" rel="preload" as="style" onload="this.rel='stylesheet'"> <noscript> <link href="/style.96106fab.css" rel="stylesheet"> </noscript> <script> /*用来加载非关键CSS的脚本*/ </script> </head> <body> <!-- 这里是App的内容 --> <script type="text/javascript" src="/build_main.js"></script> </body> </html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Bootstrap Critical</title>
  <style type="text/css">
    /* 关键CSS通过内部样式表方式引入 */
    body {
      font-family: Helvetica Neue,Helvetica,Arial,sans-serif;
      font-size: 14px;
      line-height: 1.42857;
      color: #333;
      background-color: #fff;
    }
    ...
  </style>
  <link href="/style.96106fab.css" rel="preload" as="style" onload="this.rel='stylesheet'">
  <noscript>
      <link href="/style.96106fab.css" rel="stylesheet">
  </noscript>
  <script>
    /*用来加载非关键CSS的脚本*/
  </script>
</head>
<body>
  <!-- 这里是App的内容 -->
  <script type="text/javascript" src="/build_main.js"></script>
</body>
</html>

它还将输出一个新的CSS文件,例如style.96106fab.css(文件自动Hash命名)。这个CSS文件与原始样式表相同,只是不包含关键CSS。

页面渲染

在这一点上,经过工作和汗水得出这些细节,我确信我的 Google PageSpeed Insights 的分数将是90s。

必威 15

在移动平台PSI分数为73/100,而桌面平台上好一点在88/100。它建议我“消除render-blocking的JavaScript和CSS”。

render-blocking文件增加了浏览器显示内容的时间,因为这些文件需要先下载并处理。多个render-blocking文件需要浏览器使用多个线程去获取和处理它们,等待时间进一步增加。

必威 16

优化JavaScript、CSS和web字体的传输,可以提高页面的“第一时间渲染。将这个时间降到最低,理解“关键的渲染路径”很重要,它描述了在当页面的第一个字节被收到,与页面第一次渲染成像素之间发生了什么。

WebPagetest 是用来帮助你配置网站和页面性能最好的可视化工具。

必威 17

About页面在渲染优化前的WebPagetest结果

当最小化第一次渲染时间时,我们更多的关注以尽可能快的速度渲染内容,然后允许额外的“东西”在处理过程中逐步渲染。

CSS和JavaScript

压缩样式表和JavaScript文件可以明显减少文件大小,我仅在压缩上就从一个文件上节省了56%的空间。

编写CSS,可以将一些冗长的类精简,比如“navigation” 变为 “nav”, “introduction” 变为 “intro”,都可以节省了一些空间。

有时候需要评估类库的必要性。作者总共写了135kb的代码,其中96kb是jquery,然后通过剥离jQuery和在Vanilla重写它,去除了122KB,最终压缩后的文件大小减少到13KB。(Vanilla是个梗具体可以看这个
Vanilla JS——世界上最轻量的JavaScript框架(没有之一))

之后作者设法去掉更多空间(压缩后7KB),最后脚本在压缩和gzipped后只有0.365KB。

  1. 避免CSS @import
    使用 @import方法引用CSS文件可以能会带来一些影响页面加载速度的问题,比如导致文件按顺序加载(一个加载完后才会加载另一个),而无法并行加载。
    你可以使用 CSS delivery工具 来检测页面代码中是否存在@import方法。比如,如果检测结果中存在

内联嵌入关键CSS样式

你会注意到,关键CSS已经嵌入到文档的头部。这是最佳的,因为页面不必从服务器加载它。

CSS

默认情况下,浏览器将CSS作为渲染阻塞;因此,当它加载时,浏览器暂停渲染,等待CSS已经被下载和处理。外部样式表意味着更多的网络线程,它增加了等待时间,同时大型样式表也会增加等待时间。

我们可以通过在<head>标签内联“关键CSS”来改善页面渲染时间,这样浏览器可以不用再等待下载整个样式表,就可以快速地渲染页面内容,然后通过non-rendering-blocking方式加载完整的样式表。

XHTML

<head> <style> /* inline critical CSS */ </style> </head>

1
2
3
4
5
<head>
  <style>
    /* inline critical CSS */
  </style>
</head>

确定哪些CSS是关键需要(1)查看移动或桌面下页面视口(viewport )大小,(2)识别视口中可见的元素(3)选择这些元素关联的CSS。

这可能有点棘手,特别是手工完成,但是有一些神奇的工具可以帮助加快甚至自动化这个过程。我使用 Filament Group编写的 grunt-criticalcss来帮助我为页面生成关键CSS,然后再手动优化一些CSS(合并重复的媒体查询和删除我认为不必要的CSS)。

必威 18

About页面只加载关键CSS(左侧)和加载整个CSS(右侧)的对比

现在关键CSS已经内联到<head>标签内,我使用loadCSS工具来异步加载样式表的其余部分。

XHTML

<head> <style> /* inline critical CSS */ </style> <script> // inline the loadCSS script function loadCSS( href, before, media, callback ){ ... } // then load your stylesheet loadCSS("/path/to/stylesheet.css"); </script> <noscript> <link href="/path/to/stylesheet.css" rel="stylesheet"> </noscript> </head>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<head>
  <style>
    /* inline critical CSS */
  </style>
  <script>
   // inline the loadCSS script
   function loadCSS( href, before, media, callback ){ ... }
   // then load your stylesheet
   loadCSS("/path/to/stylesheet.css");
  </script>
  <noscript>
    <link href="/path/to/stylesheet.css" rel="stylesheet">
  </noscript>
</head>

谷歌也给出non-render-blocking加载CSS的 另一个示例 。

图片

图片通常占到一个网站的大头。

可以抛弃了图标字体,使用内联SVG。SVG sprites可能是作者在整个网站使用中普通内联SVG图标的一个可行的替代解决方案。

在可能的情况下使用CSS代替图片,现在的CSS能做的已经很多了。

你也可以通过优化图片来压缩字节。有两种方法来优化图片:
有损压缩:降低图像的质量
无损压缩:不影响质量

[css] view plaincopy

预加载非关键CSS

你还会注意到,非关键CSS使用了一个看起来更复杂的link标签来加载。rel="preload"通知浏览器开始获取非关键CSS以供之后用。其关键在于,preload不阻塞渲染,无论资源是否加载完成,浏览器都会接着绘制页面。

link标签中的onload属性允许我们在非关键CSS加载完成时运行脚本。Critical模块可以自动将此脚本嵌入到文档中,这种方式提供了将非关键CSS加载到页面中的跨浏览器兼容方法。

<link href="/style.96106fab.css" rel="preload" as="style" onload="this.rel='stylesheet'"/>

1
  <link href="/style.96106fab.css" rel="preload" as="style" onload="this.rel='stylesheet'"/>

JavaScript

JavaScript也会导致render-blocking因此它的加载也应该优化可以使用以下的方法:

  1. 小的内联脚本。
  2. 在文档底部加载外部脚本。
  3. 使用defer属性推迟执行脚本。
  4. 使用async属性异步加载的脚本。

XHTML

<head> <script> // small inline JS </script> </head> <body> ... <script src="/path/to/independent-script.js" async> <script src="/path/to/parent-script.js" defer> <script src="/path/to/dependent-script.js" defer> </body>

1
2
3
4
5
6
7
8
9
10
11
<head>
  <script>
    // small inline JS
  </script>
</head>
<body>
  ...
  <script src="/path/to/independent-script.js" async>
  <script src="/path/to/parent-script.js" defer>
  <script src="/path/to/dependent-script.js" defer>
</body>

在解析HTML时 defer推迟下载脚本,一旦页面渲染完成执行脚本。defer支持很不错,但据报道存在不一致和不可靠性,所以最好同时使用defer并把脚本放置在文档底部。

在HTML解析和执行时异步下载脚本文件。这允许多个脚本文件并发下载和执行;然而,他们不能保证在一个特定的顺序加载。如果相互依赖可能需要在这些场景下修改任意脚本。

async支持大不如defer,这就是为什么我选择使用loadJS,用来异步加载JS文件的脚本。它支持老式浏览器,同时有一个有用的特性,即根据条件加载脚本。

XHTML

<head> <script> // small inline JS </script> </head> <body> ... <script> // inline loadJS function loadJS( src, cb ){ .. } // then load your JS loadJS("/path/to/script.js"); </script> <script src="/path/to/parent-script.js" defer> <script src="/path/to/dependent-script.js" defer> </body>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<head>
  <script>
    // small inline JS
  </script>
</head>
<body>
  ...
  <script>
    // inline loadJS
    function loadJS( src, cb ){ .. }
    // then load your JS
    loadJS("/path/to/script.js");
  </script>
  <script src="/path/to/parent-script.js" defer>
  <script src="/path/to/dependent-script.js" defer>
</body>

2、页面渲染

消除render-blocking的JavaScript和CSS。

render-blocking文件增加了浏览器显示内容的时间,因为这些文件需要先下载并处理。多个render-blocking文件需要浏览器使用多个线程去获取和处理它们,等待时间进一步增加。

@import url("style.css")

把Critical组件添加到webpack打包流程中

我创建了一个名为HTML Critical Webpack Plugin的插件,该插件仅仅是Critical模块的封装。它将在HTML Webpack Plugin输出文件后运行。

你可以在Webpack的项目中这样引入:

const HtmlCriticalPlugin = require("html-critical-webpack-plugin"); module.export = { ... plugins: [ new HtmlWebpackPlugin({ ... }), new ExtractTextPlugin({ ... }), new HtmlCriticalPlugin({ base: path.join(path.resolve(__dirname), 'dist/'), src: 'index.html', dest: 'index.html', inline: true, minify: true, extract: true, width: 375, height: 565, penthouse: { blockJSRequests: false, } }) ] };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const HtmlCriticalPlugin = require("html-critical-webpack-plugin");
 
module.export = {
  ...
  plugins: [
    new HtmlWebpackPlugin({ ... }),
    new ExtractTextPlugin({ ... }),
    new HtmlCriticalPlugin({
      base: path.join(path.resolve(__dirname), 'dist/'),
      src: 'index.html',
      dest: 'index.html',
      inline: true,
      minify: true,
      extract: true,
      width: 375,
      height: 565,
      penthouse: {
        blockJSRequests: false,
      }
    })
  ]
};

注意:你应该只在生产版本中使用,因为它将使你的开发环境的构建很慢

Web字体

Web字体使内容更加清晰和漂亮,但是也对页面渲染产生了负面影响。在加载页面时,特别是移动端的连接,你可能已经注意到文本在一段时间看不见。这被称为 FOIT(不可见文本闪动)。

必威 19

我的网站出现FOIT的样子

当浏览器尝试下载一个web字体,它将隐藏文本一段时间,直到它完成字体下载,才显示文本。在最糟糕的情况下,文本无限期地不可见,使内容完全不能阅读。

我处理FOIT 的方式是逐步加载字体,首先依赖默认和系统字体(例如Helvetica和Georgia)允许快速呈现的内容。Web字体然后使用loadCSS异步加载,同时通过 Font Face Observer库来检测字体何时下载成功。一旦字体下载且可用,一个类被添加到文档中,用于设置页面正确的字体。

JavaScript

<head> <style> body { font-family: Helvetica, Arial, sans-serif; } .fonts-loaded body { font-family: Roboto, Helvetica, Arial, sans-serif; } </style> <script> // inline loadCSS function loadCSS( href, before, media, callback ){ ... } // load webfonts loadCSS("//fonts.googleapis.com/css?family=Roboto:400,500,700"); // inline FontFaceObserver (function(){ ... } // detect loading of fonts var roboto400 = new FontFaceObserver("Roboto", { weight: 400 }); var roboto700 = new FontFaceObserver("Roboto", { weight: 700 }); Promise.all([ roboto400.check(), roboto700.check() ]).then(function() { document.documentElement.className += " fonts-loaded"; }); </script> </head>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<head>
  <style>
    body { font-family: Helvetica, Arial, sans-serif; }
    .fonts-loaded body { font-family: Roboto, Helvetica, Arial, sans-serif; }
  </style>
  <script>
    // inline loadCSS
    function loadCSS( href, before, media, callback ){ ... }
    // load webfonts
    loadCSS("//fonts.googleapis.com/css?family=Roboto:400,500,700");
    // inline FontFaceObserver
    (function(){ ... }
    // detect loading of fonts
    var roboto400 = new FontFaceObserver("Roboto", {
      weight: 400
    });
    var roboto700 = new FontFaceObserver("Roboto", {
      weight: 700
    });
 
    Promise.all([
      roboto400.check(),
      roboto700.check()
    ]).then(function() {
      document.documentElement.className += " fonts-loaded";
    });
  </script>
</head>

逐步加载字体将导致FOUT(没有样式的文本闪动)和FOFT(仿文本闪动),这取决于它是如何做的。

必威 20

字体逐步加载,不产生FOIT

然而,好处是内容一直可见,而不会出现看不见的情况。关于如何击败FOIT,我写了一篇的深入文章 使用字体事件加载字体。

CSS

默认情况下,浏览器将CSS作为渲染阻塞;因此,当它加载时,浏览器暂停渲染,等待CSS已经被下载和处理。外部样式表意味着更多的网络线程,它增加了等待时间,同时大型样式表也会增加等待时间。
我们可以通过在<head>标签内联“关键CSS”来改善页面渲染时间,这样浏览器可以~~~~不用再等待下载整个样式表,就可以快速地渲染页面内容,然后通过non-rendering-blocking方式加载完整的样式表。

确定哪些CSS是关键需要
(1)查看移动或桌面下页面视口(viewport )大小
(2)识别视口中可见的元素
(3)选择这些元素关联的CSS

则建议你使用下面的代码来替代。

表现结果

现在已经抽离了关键CSS,并且把非关键CSS的加载放到空闲时间,这在性能方面会有怎样的提升呢?

我使用Chrome的Lighthouse扩展插件进行测试。请记住,我们尝试优化的指标是“首次有效绘制”,也就是用户需要多久才能看到真正可浏览的页面。

不使用区分关键CSS技术的表现

必威 21

使用区分关键CSS技术的表现

必威 22

正如你所看到的,我的应用程序First Meaningful paint时间缩短了将近1秒,到达可交互状态的时间节省了0.5秒。实际中,你的应用程序可能无法获得如此惊人的改善,因为我的CSS很笨重(我包含了整个Bootstrap库),而且在这样一个简单的应用程序中,我没有很多关键CSS规则。

1 赞 1 收藏 评论

必威 23

其它

其他方法,如启用gzip和缓存、配置SSL和从内容分发网络(CDN)获取资源,可以提高前端性能,但需要一些服务器端支持。基于篇幅所限,我不会深入他们。然而我想强调的是,我推荐使用这些方法,他们将会对你的网站性能有一个全面和积极的影响。

我将提到,因为我的网站的访问量百分比相当一部分来自美国以外,而我的服务器是位于纽约,我于是决定把我的一些资源发布到CDN上。他们部署到一个 Amazon S3  bucket上,绑定到一个CloudFront版本。

JavaScript

JavaScript也会导致render-blocking,因此它的加载也应该优化。可以使用以下的方法:
小的内联脚本。
在文档底部加载外部脚本。
使用defer属性推迟执行脚本。
使用async属性异步加载的脚本。

[html] view plaincopy

综述

在过去的几个月中我一直在做性能改进,尽管这有很多工作,我确实注意到了差别。我偶尔得到关于我的网站速度的评论,这是性能调整的结果。

我还没有在指标跟踪上做得很好(特别是早期),但让我们看看基于已有数据的一些比较。

平均大小 我的站点 差别
Requests 93 19 -87.6%
Page size 1950KB 524KB -73.1%
HTML 58KB 2.8KB -95.1%
Images 1249KB 66.3 -94.7%
CSS 60KB 14.6KB -75.7%
JS 303KB 6.1KB -98.0%
Fonts 87KB 10.2KB -88.3%

总体上87.5%优于平均水平!不是很坏。现在谷歌PageSpeed也给我的网站一个不错的分数。

必威 24

优化后谷歌PageSpeed的结果

关于WebPagetest的结果**,**我注意到,尽管About页面字节增加了,但开始渲染和加载的时间大大减少。

必威 25

About页面在渲染优化后的WebPagetest结果

性能改进将永远是进行时,在 HTTP/2到来的路上其中一些将改变,之前好用的技术可能不再好用,同时有些可能完全弃用。

我觉得在过去的几个月,我取得了很大的进展,也学到了很多。我的网站在Github上是开源的,所以大家可以随时看一看。我还没有弄明白这一切,但希望我所分享的所做所学,会给你一些见解。如果你有任何问题或想聊一聊,随时骚扰我的Twitter @jonsuh或者给我发 邮件。

Web字体

Web字体使内容更加清晰和漂亮,但是也对页面渲染产生了负面影响。在加载页面时,特别是移动端的连接,你可能已经注意到文本在一段时间看不见。这被称为 FOIT(不可见文本闪动)。(FOIT:当浏览器尝试下载一个web字体,它将隐藏文本一段时间,直到它完成字体下载,才显示文本。在最糟糕的情况下,文本无限期地不可见,使内容完全不能阅读。)

<link rel="style.css" href="style.css" type="text/css">

资源

这里是丰富的有用资源,让你深入了解网站性能。

  • 深入谷歌PageSpeed
  • SpeedCurve
  • WebPagetest
  • 我的网站耗费的流量有多少?
  • 网页设计师和前端开发人员需要关注的前端性能
  • 如何让RWD网站的速度飙起来
  • 提升Smashing Magazine的性能:案例学习
  • 网站更庞大并不意味着更多的等待时间
  • 优化性能
  • RWD 膨胀 第一部分 和 第二部分
  • 谷歌PageSpeed模块
  • 负责任的社交分享链接
  • 首次访问的内联关键CSS
  • async 和 defer属性的比较
  • 使用字体事件加载字体
  • 使用字体事件再次加载字体
  • 关于字体加载后续——仿文本闪动
  • 播客——通往高性能网站

    1 赞 9 收藏 1 评论

其它

其他方法,如启用gzip和缓存、配置SSL和从内容分发网络(CDN)获取资源,可以提高前端性能,但需要一些服务器端支持。

这就是所有内容了,其他还有一些细节以及推荐,可以自己去看一下。希望不算侵权。

  1. 避免使用document.write
    在JavaScript中,可以使用 document.write在网页上显示内容或调用外部资源,而通过此方法,浏览器必须采取一些多余的步骤——下载资源、读取资源、运行JavaScript来了解需要做什么,调用其他资源时需要重新再执行一次这个过程。由于浏览器之前不知道要显示什么,所以会降低页面加载的速度。
    要知道,任何能够被document.write调用的资源,都可以通过HTML来调用,这样速度会更快。检查你的页面代码,如果存在类似于下面的代码:

关于作者:cucr

必威 26

新浪微博:@hop_ping 个人主页 · 我的文章 · 17

必威 27

[js] view plaincopy

TAG标签:
版权声明:本文由必威发布于必威-前端,转载请注明出处:前端的性能对于一个Web应用来说非常重要必威,