【前端性能优化】雅虎34条优化军规

  1. 尽量减少HTTP请求个数
    合并文件,如图片(如css sprites,内置图片使用数据)、CSS、JS

  2. 减少DNS查找次数
    DNS解析会花费20到120毫秒的时间。而且在这个过程中浏览器什么都不会做直到DNS查找完毕。可以使用IPS提供的服务器缓存 DNS

  3. 避免跳转
    跳转是使用301和302代码实现的。为了确保“后退”按钮可以正确地使用,使用标准的 3XXHTTP状态代码;同域中注意避免反斜杠 “/” 的跳转;
    跨域使用 Alias或者 mod_rewirte建立 CNAME(保存一个域名和另外一个域名之间关系的DNS记录)

  4. 可缓存的 AJAX
    利用时间戳,更精巧的实现响应可缓存与服务器数据同步更新。

  5. 推迟加载内容
    确定页面运行正常后,再加载脚本来实现如拖放和动画,或者是隐藏部分的内容以及折叠内容等。

  6. 预加载
    预加载是在浏览器空闲时请求将来可能会用到的页面内容(如图像、样式表和脚本)。使用这种方法,当用户要访问下一个页面时,页面中的内容大部分已经加载到缓存中了,因此可以大大改善访问速度。

    下面提供了几种预加载方法:
    无条件加载:触发onload事件时,直接加载额外的页面内容。
    有条件加载:根据用户的操作来有根据地判断用户下面可能去往的页面并相应的预加载页面内容。
    有预期的加载:载入重新设计过的页面时使用预加载。这种情况经常出现在页面经过重新设计后用户抱怨“新的页面看起来很酷,但是却比以前慢”。问题可能出在用户对于你的旧站点建立了完整的缓存,而对于新站点却没有任何缓存内容。因此你可以在访问新站之前就加载一部内容来避免这种结果的出现。在你的旧站中利用浏览器的空余时间加载新站中用到的图像的和脚本来提高访问速度。

  7. 减少DOM元素数量
    一个复杂的页面意味着需要下载更多数据,同时也意味着JavaScript遍历DOM的效率越慢。使用更适合或者在语意是更贴切的标签,要考虑大量DOM元素中循环的性能开销。

  8. 避免404
    HTTP请求时间消耗是很大的,有些站点把404错误响应页面改为“你是不是要找***”,这虽然改进了用户体验但是同样也会浪费服务器资源(如数据库等)。最糟糕的情况是指向外部 JavaScript的链接出现问题并返回404代码。首先,这种加载会破坏并行加载;其次浏览器会把试图在返回的404响应内容中找到可能有用的部分当作JavaScript代码来执行。

  9. 根据域名划分页面内容
    把页面内容划分成若干部分可以使你最大限度地实现平行下载。由于DNS查找带来的影响你首先要确保你使用的域名数量在2个到4个之间。

  10. 使iframe的数量最小
    ifrmae元素可以在父文档中插入一个新的HTML文档。
    优点:解决加载缓慢的第三方内容如图标和广告等的加载问题
    缺点:即时内容为空,加载也需要时间,会阻止页面加载,没有语意

  11. 使用内容分发网络
    内容分发网络(Content Delivery Network,CDN)是由一系列分散到各个不同地理位置上的Web服务器组成的,它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网络上的靠近程度来指定的。可以关注CDN的三类实现:镜像、高速缓存、专线,以及智能路由器和负载均衡;

  12. 为文件头指定Expires或Cache-Control,使内容具有缓存性。
    对于静态内容:设置文件头过期时间Expires的值为“Never expire”(永不过期)
    对于动态内容:使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求。
    要切记,如果使用了Expires文件头,当页面内容改变时就必须改变内容的文件名。依Yahoo!来说我们经常使用这样的步骤:在内容的文件名中加上版本号,如yahoo_2.0.6.js。

  13. Gzip压缩文件内容
    网络传输中的HTTP请求和应答时间可以通过前端机制得到显著改善。
    从HTTP/1.1开始,web客户端都默认支持HTTP请求中有Accept-Encoding文件头的压缩格式:Accept-Encoding: gzip, deflate。
    Gzip大概可以减少70%的响应规模。图像和PDF文件由于已经压缩过了所以不能再进行gzip压缩。如果试图gizp压缩这些文件的话不但会浪费CPU资源还会增加文件的大小。

  14. 配置ETag
    Entity tags(ETags)(实体标签)是web服务器和浏览器用于判断浏览器缓存中的内容和服务器中的原始内容是否匹配的一种机制(“实体”就是所说的“内 容”,包括图片、脚本、样式表等),是比last-modified date更加灵活的机制,单位时间内文件被修过多次,Etag可以综合Inode(文件的索引节点(inode)数),MTime(修改时间)和Size来精准的进行判断,避开UNIX记录MTime只能精确到秒的问题。 服务器集群使用,可取后两个参数。使用ETags减少Web应用带宽和负载。

  15. 尽早刷新输出缓冲
    当用户请求一个页面时,无论如何都会花费200到500毫秒用于后台组织HTML文件。在这期间,浏览器会一直空闲等待数据返回。在PHP中,你可以使用flush()方法,它允许你把已经编译的好的部分HTML响应文件先发送给浏览器,这时浏览器就会可以下载文件中的内容(脚本等)而后台同时处理剩余的HTML页面。

    输出缓冲应用最好的一个地方就是紧跟在之后,因为HTML的头部分容易生成而且头部往往包含CSS和JavaScript文件,这样浏览器就可以在后台编译剩余HTML的同时并行下载它们。

  16. 使用GET来完成AJAX请求
    当使用XMLHttpRequest时,浏览器中的POST方法是一个“两步走”的过程:首先发送文件头,然后才发送数据。因此使用GET最为恰当,因为它只需发送一个TCP包(除非你有很多cookie)。IE中URL的最大长度为2K,因此如果你要发送一个超过2K的数据时就不能使用GET了。
    一个有趣的不同就是POST并不像GET那样实际发送数据。根据HTTP规范,GET意味着“获取”数据,因此当你仅仅获取数据时使用GET更加有意义(从语意上讲也是如此),相反,发送并在服务端保存数据时使用POST。

  17. 把样式表置于顶部
    实现页面有秩序地加载,这对于拥有较多内容的页面和网速较慢的用户来说更为重要,同时,HTML规范清楚指出样式表要放包含在页面的区域内;

  18. 避免使用CSS表达式
    CSS表达式是动态设置CSS属性的强大(但危险)方法,页面显示和缩放,滚动、乃至移动鼠标时,CSS表达式的计算频率是非常高的。可以考虑一次性的表达式或者使用事件句柄来代替CSS表达式。

  19. 使用外部JavaScript和CSS
    在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓存。内置在HTML文档中的JavaScript和CSS则会在每次请求中随HTML文档重新下载。这虽然减少了HTTP请求的次数,却增加了HTML文档的大小。从另一方面来说,如果外部文件中的JavaScript和CSS被浏览器缓存,在没有增加HTTP请求次数的同时可以减少HTML文档的大小。

  20. 削减JavaScript和CSS
    精简是指从去除代码不必要的字符减少文件大小从而节省下载时间。消减代码时,所有的注释、不需要的空白字符(空格、换行、tab缩进)等都要去掉。目的就是减少下载的文件体积,可考虑压缩工具JSMin和YUICompressor。

  21. 用代替@import

  22. 避免使用滤镜
    完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工作。如果你确实需要使用 AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。

  23. 把脚本置于页面底部
    脚本带来的问题就是它阻止了页面的平行下载。HTTP/1.1 规范建议,浏览器每个主机名的并行下载内容不超过两个。如果你的图片放在多个主机名上,你可以在每个并行下载中同时下载2个以上的文件。但是当下载脚本时,浏览器就不会同时下载其它文件了,即便是主机名不相同。

  24. 剔除重复脚本
    重复调用脚本,除了增加额外的HTTP请求外,多次运算也会浪费时间。在IE和Firefox中不管脚本是否可缓存,它们都存在重复运算JavaScript的问题。

  25. 减少DOM访问
    使用JavaScript访问DOM元素比较慢,因此为了获得更多的应该页面,应该做到:
    缓存已经访问过的有关元素
    线下更新完节点之后再将它们添加到文档树中
    避免使用JavaScript来修改页面布局

  26. 开发智能事件处理程序
    有时候我们会感觉到页面反应迟钝,这是因为DOM树元素中附加了过多的事件句柄并且些事件句病被频繁地触发。这就是为什么说使用event delegation(事件代理)是一种好方法了。如果你在一个div中有10个按钮,你只需要在div上附加一次事件句柄就可以了,而不用去为每一个按钮增加一个句柄。事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。
    你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问的元素出现。你也不用等待所有图像都加载完毕。

  27. 减小Cookie体积
    去除不必要的coockie
    使coockie体积尽量小以减少对用户响应的影响
    注意在适应级别的域名上设置coockie以便使子域名不受影响
    设置合理的过期时间。较早地Expire时间和不要过早去清除coockie,都会改善用户的响应时间。

  28. 对于页面内容使用无coockie域名
    确定对于静态内容的请求是无coockie的请求。创建一个子域名并用他来存放所有静态内容。

  29. 优化图像
    尝试把GIF格式转换成PNG格式,看看是否节省空间。在所有的PNG图片上运行pngcrush(或者其它PNG优化工具)

  30. 优化CSS Spirite
    在Spirite中水平排列你的图片,垂直排列会稍稍增加文件大小;
    Spirite中把颜色较近的组合在一起可以降低颜色数,理想状况是低于256色以便适用PNG8格式;
    便于移动,不要在Spirite的图像中间留有较大空隙。这虽然不大会增加文件大小但对于用户代理来说它需要更少的内存来把图片解压为像素地图。100x100的图片为1万像素,而1000x1000就是100万像素。

  31. 不要在HTML中缩放图像
    不要为了在HTML中设置长宽而使用比实际需要大的图片。如果你需要:
    <img width="100" height="100" src="mycat.jpg" alt="My Cat" />
    那么你的图片(mycat.jpg)就应该是100x100像素而不是把一个500x500像素的图片缩小使用。

  32. favicon.ico要小而且可缓存
    favicon.ico是位于服务器根目录下的一个图片文件。它是必定存在的,因为即使你不关心它是否有用,浏览器也会对它发出请求,因此最好不要返回一个404 Not Found的响应。由于是在同一台服务器上,它每被请求一次coockie就会被发送一次。这个图片文件还会影响下载顺序,例如在IE中当你在onload中请求额外的文件时,favicon会在这些额外内容被加载前下载。
    因此,为了减少favicon.ico带来的弊端,要做到:

    文件尽量地小,最好小于1K
    在适当的时候(也就是你不要打算再换favicon.ico的时候,因为更换新文件时不能对它进行重命名)为它设置Expires文件头。你可以很安全地把Expires文件头设置为未来的几个月。你可以通过核对当前favicon.ico的上次编辑时间来作出判断。
    Imagemagick可以帮你创建小巧的favicon。

  33. 保持单个内容小于25K
    因为iPhone不能缓存大于25K的文件。注意这里指的是解压缩后的大小。由于单纯gizp压缩可能达不要求,因此精简文件就显得十分重 要。

  34. 打包组件成复合文本
    把页面内容打包成复合文本就如同带有多附件的Email,它能够使你在一个HTTP请求中取得多个组件(切记:HTTP请求是很奢侈的)。当你使用这条规则时,首先要确定用户代理是否支持(iPhone就不支持)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码搬运媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值