Yslow 23条前端性能优化规则

做者:野次
连接: https://www.zhihu.com/question/33032042/answer/95948831
Yslow是雅虎开发的基于网页性能分析浏览器插件,能够检测出网页的具体性能值,而且有著名的Yslow 23条优化规则。

1. 减小HTTP请求次数css

尽可能合并图片、CSS、JS。好比加载一个页面,若是有5个css文件的话,那么会发出5次http请求,这样会让用户第一次访问你的页面的时候会长时间等待。而若是把这个5个文件合成一个的话,就只须要发出一次http请求,节省网络请求时间,加快页面的加载。

2. 使用CDNhtml

网站上静态资源即css、js全都使用cdn分发,图片亦然。

3. 避免空的src和href前端

当link标签的href属性为空、script标签的src属性为空的时候,浏览器渲染的时候会把当前页面的URL做为它们的属性值,从而把页面的内容加载进来做为它们的值。因此要避免犯这样的疏忽。node

4. 为文件头指定Expiresnginx

Exipres是用来设置文件的过时时间的,通常对css、js、图片资源有效。 他可使内容具备缓存性,这样下回再访问一样的资源时就经过浏览器缓存区读取,不须要再发出http请求。以下例子:
新浪微博的这个css文件的Expires时间是2016-5-04 09:14:14.

5. 使用gzip压缩内容ajax

gzip可以压缩任何一个文本类型的响应,包括html,xml,json。大大缩小请求返回的数据量。

6. 把CSS放到顶部express

网页上的资源加载时从上网下顺序加载的,因此css放在页面的顶部可以优先渲染页面,让用户感受页面加载很快。

7. 把JS放到底部json

加载js时会对后续的资源形成阻塞,必须得等js加载完才去加载后续的文件 ,因此就把js放在页面底部最后加载。

8. 避免使用CSS表达式浏览器

举个css表达式的例子
font-color: expression( (new Date()).getHours()%3 ? “#FFFFFF" : “#AAAAAA" );
这个表达式会持续的在页面上计算样式,影响页面的性能。而且css表达式只被IE支持。

9. 将CSS和JS放到外部文件中缓存

目的是缓存文件,能够参考原则4。 但有时候为了减小请求,也会直接写到页面里,需根据PV和IP的比例权衡。

10. 权衡DNS查找次数

减小主机名能够节省响应时间。但同时,须要注意,减小主机会减小页面中并行下载的数量。

IE浏览器在同一时刻只能从同一域名下载两个文件。当在一个页面显示多张图片时,IE 用户的图片下载速度就会受到影响。因此新浪会搞N个二级域名来放图片。

下面是新浪微博的图片域名,咱们能够看到他有多个域名,这样能够保证这些不一样域名可以同时去下载图片,而不用排队。不过若是当使用的域名过多时,响应时间就会慢,由于不用响应域名时间不一致。


11. 精简CSS和JS

这里就涉及到css和js的压缩了。好比下面的新浪的一个css文件,把空格回车所有去掉,减小文件的大小。如今的压缩工具备不少,基本主流的前端构建工具都能进行css和js文件的压缩,如grunt,glup等。

12. 避免跳转

有种现象会比较坑爹,看起来没什么差异,其实屡次了一次页面跳转。好比当URL本该有斜杠(/)却被忽略掉时。例如,当咱们要访问 时,实际上返回的是一个包含301代码的跳转,它指向的是 (注意末尾的斜杠)。在nginx服务器可使用rewrite;Apache服务器中可使用Alias 或者 mod_rewrite或者the DirectorySlash来避免。

另外一种是不用域名之间的跳转, 好比访问 跳转到。那么能够经过使用Alias或者mod_rewirte创建CNAME(保存一个域名和另一个域名之间关系的DNS记录)来替代。

13. 删除重复的JS和CSS

重复调用脚本,除了增长额外的HTTP请求外,屡次运算也会浪费时间。在IE和Firefox中无论脚本是否可缓存,它们都存在重复运算JavaScript的问题。

14. 配置ETags

它用来判断浏览器缓存里的元素是否和原来服务器上的一致。比last-modified date更具备弹性,例如某个文件在1秒内修改了10次,Etag能够综合Inode(文件的索引节点(inode)数),MTime(修改时间)和Size来精准的进行判断,避开UNIX记录MTime只能精确到秒的问题。 服务器集群使用,可取后两个参数。使用ETags减小Web应用带宽和负载

15. 可缓存的AJAX

异步请求一样的形成用户等待,因此使用ajax请求时,要主动告诉浏览器若是该请求有缓存就去请求缓存内容。以下代码片断, cache:true就是显式的要求若是当前请求有缓存的话,直接使用缓存
$.ajax({
     url : 'url',
     dataType : "json",
     cache: true,
     success : function(son, status){    
             }

16. 使用GET来完成AJAX请求

当使用XMLHttpRequest时,浏览器中的POST方法是一个“两步走”的过程:首先发送文件头,而后才发送数据。所以使用GET获取数据时更加有意义。

17. 减小DOM元素数量

这是一门大学问,这里能够引伸出一堆优化的细节。想要具体研究的能够看后面推荐书籍。总之大原则减小DOM数量,就会减小浏览器的解析负担。

18. 避免404

好比外链的css或者js文件出现问题返回404时,会破坏浏览器对文件的并行加载。而且浏览器会把试图在返回的404响应内容中找到可能有用的部分看成JavaScript代码来执行。

19. 减小Cookie的大小

Cookie里面别塞那么多东西,由于每一个请求都得带着他跑

20. 使用无cookie的域

好比CSS、js、图片等,客户端请求静态文件的时候,减小了 Cookie 的反复传输对主域名的影响。

21. 不要使用滤镜

IE独有属性AlphaImageLoader用于修正7.0如下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现而且冻结浏览器。在每个元素(不只仅是图片)它都会运算一次,增长了内存开支,所以它的问题是多方面的。
彻底避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工做。若是你确实须要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。

22. 不要在HTML中缩放图片

好比你须要的图片尺寸是50* 50

<img width=”50″ height=”50″ src=“hahah.jpg” alt=”hahaha” />

那就不用用一张500*500的大尺寸图片,影响加载

23. 缩小favicon.ico并缓存

相关文章
相关标签/搜索