We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
80%的页面初始化响应时间花费在前端,而大部分时间都是在下载所有的页面组件,例如图片,css,js等。所以减少请求数量是让网页变快的关键。 其中一种方法是将页面设计的更简单,但是有没有方法是能既将页面设计得丰富多彩,同时又拥有高性能呢?线面提供一些建议:
用户与web服务器的物理距离对响应时间有影响。因此同时布置多个web服务器分布在华南,华北,华中,深圳,上海,等集中地区,可以加速,但是你又应该从哪开始呢?
Expires: Thu, 15 Apr 2018 20:00:00 GMT // 在2018年4月15日8点过期
ExpiresDefault "access plus 10 years" // 10年后过期
如果设置了超长过期时间,那么更新文件只能通过 更改文件后缀的hash值来更新。
尤其对于单页面应用(SPA),这种将所有页面打包在一起,通常可以压缩至1/3. 从HTTP/1.1开始,web客户端通过请求的头部添加Accept-Encoding来告诉浏览器要压缩。
Accept-Encoding: gzip, deflate
如果浏览器又看到这个的话,会做出如下响应
Content-Encoding: gzip
Gzip是现在用的最多的高效小压缩的方法。它可以压缩70%,90%的浏览都经过Gzip压缩。如果你是Apache服务器,1.3版本是mod_gizp, 2.x版本用mod)deflate.,, 但是值得注意的是,压缩要基于文件类型,像html,js,css,json文件都需要压缩,但是图片和pdf是不需要压缩的,因为他们本身就经过压缩了,再去压缩他们只会浪费CPU,而且压缩后文件体积反而会增大,
Yahoo!性能研究,我们发现将css文档放在<head></head>种,页面会更快加载,具体请参照bootstrapt Starter template,
<head></head>
<!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> <title>Hello, world!</title> </head> <body> <h1>Hello, world!</h1> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> </body> </html>
前端工程师在意页面性能,所以想要页面逐步加载,这也是Yahoo!工程师想要的,这就是,我们想要浏览器更快显示他的内容,这对于网速慢的用户尤其重要,当浏览器逐步加载页面的时候,标题导航栏顶部徽标最为等待页面的用户的视觉返回,这大大改善用户整体体验。而如果你将css文件放在文档底部的话,无法做到内容渐进式呈现,例如IE,这样子的话,页面会停留在空白页。 嗯~ o( ̄▽ ̄)o,HTML规范文档也是这么要求的。
js文件如果异常报错,会阻止同步的下载内容,一般建议延迟加载,给<script>标签添加defer属性,不过firfox又不支持,如果将脚本放在底部,并添加defer属性延迟加载,页面加载速度更快。
<script>
css表达式是一种强大(危险)的方式动态设置css属性,适用ie5-ie8,他可能会在极短的时间内执行1w次,
background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
通常html文档都会下载,而css和js则会从缓存中加载。如果分离开,则html依然要下载,但是体积会减小。这个关键在于,用户从缓存中拿文件和重新加载新文件哪种情况更多。一种可以减少请求次数,另一种可以html文件体积。但是也有例外情况,比如Yahoo!和百度的首页的css和js就是内嵌的,因为大多数这种首页需要极速访问,也经过实际调研,也确实如此。这种会话只有很少的页面视图的主页,内嵌可以缩短最终用户的响应时间。 通常对于许多网站他们的第一个首页,有一些技术可以减少内联提供的http请求,以及通过外部文件实现缓存优势,其中一种方法,就是在首页内嵌js和css,但是在页面加载完成后,动态下载外部文件,后续页面将引用应该以及存在浏览器缓存中的外部文件。
DNS将主机名映射到IP地址,就像查询人的手机号码一样,但是DNS映射是需要20-120ms才能找到的,所以DNS会缓存他之前的查找,例如chrome浏览器就有自己的DNS缓存,IE默认存储30分钟DNS缓存,减少唯一主机名数量,可以减少页面中查找DNS的并行下载时间。
通常删除注释,以及空白字符,换行符,制表符(\n\t\s),这个webpack,grunt,gulp,parcel等打包工具都可以做到,同样的,html标签之间的空白,幽灵节点,同样可以通过压缩消除。
例如nginx通常就将http => https,重定向是使用301和302状态码完成的,
HTTP/1.1 301 Moved Permanently Location: http://example.com/newuri Content-Type: text/html
浏览器会自动将用户带到位置字段中指定的URL。重定向所需的所有信息都在标题中。响应的主体通常是空的。尽管名称不同,301和302响应在实践中都不会被缓存,除非额外的头文件(例如Expires或Cache-Control)指示它应该是。元刷新标记和JavaScript是将用户引导到不同URL的其他方式,但是如果您必须执行重定向,首选方法是使用标准的3xx HTTP状态代码,主要是为了确保后退按钮正常工作。 重定向会减慢用户体验,并且在HTML页面到来之前不会下载任何内容。 最浪费的重定向经常发生,web开发人员通常不知道例如当你访问https://www.baidu.com会发生重定向https://www.baidu.com/,然后默认加载https://www.baidu.com/目录下的index.html文件。 将就网址链接到新网站,是重定向最常见的用途,创建一个CNAME文件在被定向的url目录下。
https://www.baidu.com
https://www.baidu.com/
实体标签ETags唯一标识符
ETags
HTTP/1.1 200 OK Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT ETag: "10c24bc-4ab-457e1c1f" Content-Length: 12195
Ajax引用的好处之一,他想用户提供返回,因为它从后台请求数据。为了提高性能,优化Ajax响应非常重要,提高Ajax性能的最重要的方法就是将响应缓存,如添加过期或缓存控制头中所属,其他规则同样适用,
当用户请求页面时,后端服务器可能需要200到500毫秒才能将HTML页面拼接在一起。在此期间,浏览器在等待数据到达时处于空闲状态。在PHP中,你有函数flush()。它允许您将部分就绪的HTML响应发送到浏览器,以便浏览器可以在您的后端忙于HTML页面的其余部分时开始获取组件。好处主要出现在繁忙的后端或前端。 考虑刷新的好地方就在HEAD之后,因为头部的HTML通常更容易生成,并且允许您在浏览器中包含任何CSS和JavaScript文件,以便在后端仍在处理时开始并行读取。
flush()
HEAD
... <!-- css, js --> </head> <?php flush(); ?> <body> ... <!-- content -->
Yahoo! 团队发现,当使用ajax XMLHttpRequest,的时候, POST实现浏览器,分为2个步骤,
XMLHttpRequest
POST
headers
GET
但是post更慢, post请求过程
你可以看一下你的页面,哪些是为了呈现最初页面,必须要呈现的组件,而其余的组件可以稍后加载。
js在onload事件之后比较适合初始化某些库,原生js的onload事件和jQuery的$( document ).ready()有区别,jquery会在js文件加载完就执行,而原生onload事件,则要等到dom里面的图片全部加载好才能触发事件。
$( document ).ready()
他是后加载组件的对立面,它可以节省时间
复杂dom结构,js访问速度更慢,要遍历更多元素。
比如说你的图片网站html存在https://www.example.com/,而你的静态资源,储存在http://static.example.com/,这样可以让你最大限度的平行下载,由于DNS查找惩罚,请确保域不超过2-4个。
https://www.example.com/
http://static.example.com/
iframes允许一个HTML文档插入父文档,了解iframe如何工作以便可以有效使用,这很重要。
<iframe>
HTTP请求比较昂贵,因此提出http请求获得无用的响应完全没有必要。而有些网站提供了404前台页面,用户体验不错,但也浪费了服务器资源,特别糟糕当外部错误并是404时候,首先此下载会阻止并行下载,浏览器会尝试解析她,就好像他是js代码。
http cookie被用来做用户验证,以及其他个性化东西,信息关于cookie可以在服务器和浏览器之间交换,降低cookies大小可以减少用户响应时间,这很重要。 请注意以下四点
当浏览器制作一个请求,比如请求一个图片,这种完全没有cookies的必要。所以你要专门设置一个托管静态资源的子域名。
js遍历dom很慢,请注意以下三点:
事件总代理,比如你有10个按钮的导航栏,不要分别给他们设置事件触发。请给他们的父容器设置总代理,对e.path做路径判断,ie没有path,请自行合成path,这个就是事件冒泡。 你不需要等到onload事件触发在添加事件代理,应为只有图片成功加载后才出发onload事件,你可以用jq的ready,或者原生的DOMContentLoaded,
<script> document.addEventListener("DOMContentLoaded", function(event) { console.log("DOM fully loaded and parsed"); }); </script>
<link>
css放在最顶端,
filters
当设计师完成图纸,将图片传到web服务器之前,仍可以进行一些操作
请设置width或者height来缩放图片
favicon.ico
浏览器每次都会请求他,所以最好不要回应404,最好缓存它。 请注意以下3点
为什么呢?因为iphone不会缓存25k以上的组件。
为什么下述行为有害?
参考:
The text was updated successfully, but these errors were encountered:
plh97
No branches or pull requests
1.减少http请求
80%的页面初始化响应时间花费在前端,而大部分时间都是在下载所有的页面组件,例如图片,css,js等。所以减少请求数量是让网页变快的关键。
其中一种方法是将页面设计的更简单,但是有没有方法是能既将页面设计得丰富多彩,同时又拥有高性能呢?线面提供一些建议:
减少http请求次数仅仅只是开始。同时他也是提高用户初次访问时候页面性能的重要知道方针。
2.使用内容交付网络。(参照七牛cdn静态资源加速)
用户与web服务器的物理距离对响应时间有影响。因此同时布置多个web服务器分布在华南,华北,华中,深圳,上海,等集中地区,可以加速,但是你又应该从哪开始呢?
3.添加Expires或者Cache-Control
2个规则
我们的网站设计得日益复杂,这意味着更多的静态资源,但是通过Expires的设置,可以避免多余的请求,通常公司图标需要这样设置,但是其实我们对于每一个资源都需要设置过期时间。
浏览器和代理商使用缓存来减少http请求,使得页面加载更快,
如果你的服务器是Apache,
如果设置了超长过期时间,那么更新文件只能通过 更改文件后缀的hash值来更新。
4.Gzip Components 组件压缩(服务器端)
尤其对于单页面应用(SPA),这种将所有页面打包在一起,通常可以压缩至1/3.
从HTTP/1.1开始,web客户端通过请求的头部添加Accept-Encoding来告诉浏览器要压缩。
如果浏览器又看到这个的话,会做出如下响应
Gzip是现在用的最多的高效小压缩的方法。它可以压缩70%,90%的浏览都经过Gzip压缩。如果你是Apache服务器,1.3版本是mod_gizp, 2.x版本用mod)deflate.,,
但是值得注意的是,压缩要基于文件类型,像html,js,css,json文件都需要压缩,但是图片和pdf是不需要压缩的,因为他们本身就经过压缩了,再去压缩他们只会浪费CPU,而且压缩后文件体积反而会增大,
5.将css样式文件放在顶部
Yahoo!性能研究,我们发现将css文档放在
<head></head>
种,页面会更快加载,具体请参照bootstrapt Starter template,前端工程师在意页面性能,所以想要页面逐步加载,这也是Yahoo!工程师想要的,这就是,我们想要浏览器更快显示他的内容,这对于网速慢的用户尤其重要,当浏览器逐步加载页面的时候,标题导航栏顶部徽标最为等待页面的用户的视觉返回,这大大改善用户整体体验。而如果你将css文件放在文档底部的话,无法做到内容渐进式呈现,例如IE,这样子的话,页面会停留在空白页。
嗯~ o( ̄▽ ̄)o,HTML规范文档也是这么要求的。
6.将js放在文档底部
js文件如果异常报错,会阻止同步的下载内容,一般建议延迟加载,给
<script>
标签添加defer属性,不过firfox又不支持,如果将脚本放在底部,并添加defer属性延迟加载,页面加载速度更快。7.避免css 表达式
css表达式是一种强大(危险)的方式动态设置css属性,适用ie5-ie8,他可能会在极短的时间内执行1w次,
8.是否要将js,css 和html文件分离
通常html文档都会下载,而css和js则会从缓存中加载。如果分离开,则html依然要下载,但是体积会减小。这个关键在于,用户从缓存中拿文件和重新加载新文件哪种情况更多。一种可以减少请求次数,另一种可以html文件体积。但是也有例外情况,比如Yahoo!和百度的首页的css和js就是内嵌的,因为大多数这种首页需要极速访问,也经过实际调研,也确实如此。这种会话只有很少的页面视图的主页,内嵌可以缩短最终用户的响应时间。
通常对于许多网站他们的第一个首页,有一些技术可以减少内联提供的http请求,以及通过外部文件实现缓存优势,其中一种方法,就是在首页内嵌js和css,但是在页面加载完成后,动态下载外部文件,后续页面将引用应该以及存在浏览器缓存中的外部文件。
9.减少DNS(Domain Name System)查找。
DNS将主机名映射到IP地址,就像查询人的手机号码一样,但是DNS映射是需要20-120ms才能找到的,所以DNS会缓存他之前的查找,例如chrome浏览器就有自己的DNS缓存,IE默认存储30分钟DNS缓存,减少唯一主机名数量,可以减少页面中查找DNS的并行下载时间。
10.压缩js和css
通常删除注释,以及空白字符,换行符,制表符(\n\t\s),这个webpack,grunt,gulp,parcel等打包工具都可以做到,同样的,html标签之间的空白,幽灵节点,同样可以通过压缩消除。
11.避免重定向(Redirects)
例如nginx通常就将http => https,重定向是使用301和302状态码完成的,
浏览器会自动将用户带到位置字段中指定的URL。重定向所需的所有信息都在标题中。响应的主体通常是空的。尽管名称不同,301和302响应在实践中都不会被缓存,除非额外的头文件(例如Expires或Cache-Control)指示它应该是。元刷新标记和JavaScript是将用户引导到不同URL的其他方式,但是如果您必须执行重定向,首选方法是使用标准的3xx HTTP状态代码,主要是为了确保后退按钮正常工作。
重定向会减慢用户体验,并且在HTML页面到来之前不会下载任何内容。
最浪费的重定向经常发生,web开发人员通常不知道例如当你访问
https://www.baidu.com
会发生重定向https://www.baidu.com/
,然后默认加载https://www.baidu.com/
目录下的index.html文件。将就网址链接到新网站,是重定向最常见的用途,创建一个CNAME文件在被定向的url目录下。
12.删除重复的js文件,
13.设置 ETags
实体标签
ETags
唯一标识符14.将ajax数据实现可缓存
Ajax引用的好处之一,他想用户提供返回,因为它从后台请求数据。为了提高性能,优化Ajax响应非常重要,提高Ajax性能的最重要的方法就是将响应缓存,如添加过期或缓存控制头中所属,其他规则同样适用,
15.尽早清洗缓存
当用户请求页面时,后端服务器可能需要200到500毫秒才能将HTML页面拼接在一起。在此期间,浏览器在等待数据到达时处于空闲状态。在PHP中,你有函数
flush()
。它允许您将部分就绪的HTML响应发送到浏览器,以便浏览器可以在您的后端忙于HTML页面的其余部分时开始获取组件。好处主要出现在繁忙的后端或前端。考虑刷新的好地方就在
HEAD
之后,因为头部的HTML通常更容易生成,并且允许您在浏览器中包含任何CSS和JavaScript文件,以便在后端仍在处理时开始并行读取。例子
16.尽量使用Get请求
Yahoo! 团队发现,当使用ajax
XMLHttpRequest
,的时候,POST
实现浏览器,分为2个步骤,headers
,POST相对GET的不同,
POST
比GET
更安全;但是post更慢,
post请求过程
get请求过程
所以,最优使用get请求,当然如果你的cookie比较多又另算,如果仅仅只是想要得到数据,用get。
17.后加载组件
你可以看一下你的页面,哪些是为了呈现最初页面,必须要呈现的组件,而其余的组件可以稍后加载。
js在onload事件之后比较适合初始化某些库,原生js的onload事件和jQuery的
$( document ).ready()
有区别,jquery会在js文件加载完就执行,而原生onload事件,则要等到dom里面的图片全部加载好才能触发事件。18.预加载组件
他是后加载组件的对立面,它可以节省时间
19.减少DOM元素数量
复杂dom结构,js访问速度更慢,要遍历更多元素。
20.拆分组件跨域
比如说你的图片网站html存在
https://www.example.com/
,而你的静态资源,储存在http://static.example.com/
,这样可以让你最大限度的平行下载,由于DNS查找惩罚,请确保域不超过2-4个。21.减少ifrane'数量
iframes允许一个HTML文档插入父文档,了解iframe如何工作以便可以有效使用,这很重要。
<iframe>
优点:<iframe>
缺点:22.不要404s
HTTP请求比较昂贵,因此提出http请求获得无用的响应完全没有必要。而有些网站提供了404前台页面,用户体验不错,但也浪费了服务器资源,特别糟糕当外部错误并是404时候,首先此下载会阻止并行下载,浏览器会尝试解析她,就好像他是js代码。
23.减少cookie体积
http cookie被用来做用户验证,以及其他个性化东西,信息关于cookie可以在服务器和浏览器之间交换,降低cookies大小可以减少用户响应时间,这很重要。
请注意以下四点
24.为组件使用无cookie域名
当浏览器制作一个请求,比如请求一个图片,这种完全没有cookies的必要。所以你要专门设置一个托管静态资源的子域名。
25.最小化dom访问
js遍历dom很慢,请注意以下三点:
26.发展智能事件处理
事件总代理,比如你有10个按钮的导航栏,不要分别给他们设置事件触发。请给他们的父容器设置总代理,对e.path做路径判断,ie没有path,请自行合成path,这个就是事件冒泡。
你不需要等到onload事件触发在添加事件代理,应为只有图片成功加载后才出发onload事件,你可以用jq的ready,或者原生的DOMContentLoaded,
27.选择
<link>
而不要@importcss放在最顶端,
28.避免
filters
这个css属性29.优化图片
当设计师完成图纸,将图片传到web服务器之前,仍可以进行一些操作
30.优化css 精灵
31.不要用scale缩放图片在html
请设置width或者height来缩放图片
32.将
favicon.ico
变得更小,可储存。浏览器每次都会请求他,所以最好不要回应404,最好缓存它。
请注意以下3点
33.保持组件低于25k
为什么呢?因为iphone不会缓存25k以上的组件。
34.将组件打包成多部分文.
35.避免空的img.src
为什么下述行为有害?
空的img.src会毁坏您的网站
参考:
The text was updated successfully, but these errors were encountered: