欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

雅虎性能优化规则

程序员文章站 2022-07-02 11:03:16
...
/**
 * Yahoo网站优化29条规则:(https://developer.yahoo.com/performance/rules.html)
 *      1. Minimize HTTP Requests–尽可能减少HTTP请求次数.
 *          a.CSS Sprites
 *          b.Image maps 图像映射
 *              图像映射允许作者指定图像或对象的区域,并为每个区域分配指定动作(如检索文档、运行程序等),当用户**该区域,执行该动作
 *              两种类型的图像映射:
 *                  I.客户端  当用户鼠标**客户端指定区域,会触发该指定区域的链接,并跳转到指定链接
 *                  II.服务器端 当用户鼠标**服务器端指定区域,点击的像素坐标元素的href属性被发送到服务器端指定的代理,服务器端代理解释坐标并执行一些操作
 *              客户端图像映射比服务器端图像映射更受欢迎至少有两个原因:
 *                  使用非图形用户代理进行浏览的用户可以访问客户端图像映射,并且可以立即提供有关指针是否位于活动区域上的反馈。 
 *          example:
 *           ☆  客户端图像映射
 *              HTML <map> 标签
 *              使用场景:点击地图的不同省份分别跳到不同的连接
 *              定义:定义一个客户端图像映射。图像映射(image-map)指带有可点击区域的一幅图像。
 *              用法:
 *                  <img src="planets.jpg" border="0" usemap="#planetmap" alt="Planets" />
 *                  <map name="planetmap" id="planetmap">
 *                      <area shape="circle" coords="180,139,14" href ="venus.html" alt="Venus" />
 *                      <area shape="circle" coords="129,161,10" href ="mercur.html" alt="Mercury" />
 *                      <area shape="rect" coords="0,0,110,260" href ="sun.html" alt="Sun" />
 *                  </map>
 *              注释:
 *                  1).<img>中的 usemap 属性可引用 <map> 中的 id 或 name 属性(取决于浏览器),
 *                      所以我们应同时向 <map> 添加 id 和 name 属性。
 *                  2).area 元素永远嵌套在 map 元素内部。area 元素可定义图像映射中的区域
 *              <area>标签:
 *                  必须属性:
 *                      alt   定义此区域的替换文本
 *                  可选属性:
 *                      shape   定义区域的形状。   default|rect|circ|poly
 *                      coords 定义可点击区域(对鼠标敏感的区域)的坐标。
 *                          coords 属性坐标含义取决于shape属性中决定的区域形状(矩形、圆形、多边形)
 *                          每种形状的适当值:
 *                              I.圆形:shape="circ"  coords="x,y,r"
 *                                 注意: 
 *                                   ·x,y定义了圆心的位置,r是以像素为单位的圆形半径。
 *                              II.多边形:shape="poly"  coords="x1,y1,x2,y2,x3,y3,..."
 *                                 注意: 
 *                                   ·每一对'x,y'坐标都定义了多边形一个顶点的坐标。
 *                                   ·多边形会自动封闭,所以不需要在结尾重复第一个坐标来闭合整个区域。
 *                              III.矩形: shape="rect",coords="x1,y1,x2,y2"  
 *                                 注意: 
 *                                   ·每一对'x,y'坐标是矩形一个角的顶点坐标,另一对坐标是对角的坐标。
 *                                   ·定义矩形实际上是定义带有四个顶点的多边形的一种简化方法。
 *                           注释:
 *                              如果某个 area 标签中的坐标和其他区域发生了重叠,会优先采用最先出现的 area 标签。
 *                              浏览器会忽略超过图像边界范围之外的坐标            
 *         
 *                      href   定义此区域的目标 URL。
 *                          链接的 URL。可能的值:
 *                              绝对 URL - 指向另一个站点(比如 href="http://www.example.com/sun.htm")
 *                              相对 URL - 指向站点内的某个文件(href="sun.htm")
 *                              锚 URL - 指向页面中的锚(href="#sun")
 *                      nohref   从图像映射排除某个区域。nohref="nohref" 
 *                      target   规定在何处打开 href 属性指定的目标 URL。  _blank|_parent|_self|_top
 *                          _blank  在新窗口中打开被链接文档。
 *                          _self 默认。在相同的框架中打开被链接文档。
 *                          _parent 在父框架集中打开被链接文档。
 *                          _top 在整个窗口中打开被链接文档。
 *                          framename 在指定的框架中打开被链接文档。
 *             ☆ 服务器端图像映射
 *                  在图像映射对于客户端图像映射来说太复杂的情况下,服务器端图像映射可能是有趣的。
 *                      I.只能为img和input元素定义服务器端图像映射
 *                      II.当是img元素时,img必须在元素内,并且自己必须设置一个boolean值的属性 ismap.
 *                      III.当是input元素时,它的type必须是'image'
 *                  注意:当用户通过单击图像**链接时,屏幕坐标将直接发送到文档所在的服务器
 *                  example:
 *                      <A href="http://www.acme.com/cgi-bin/competition">
 *                          <IMG src ="game.gif" ismap alt ="target"> 
 *                      </A>
 *                      如果用户在位置x = 10,y = 27处单击,则派生的URI是"http://www.acme.com/cgi-bin/competition?10,27"
 *      2. Use a Content Delivery Network–使用CDN(内容分发网络).
 *           解决用户与web服务器的距离对响应时间的影响,CDN是分布在多个位置的Web服务器的集合,就近访问。
 *      3. Add an Expires or a Cache-Control Header–为文件头指定Expires或Cache-Control,使内容具有缓存性
 *           Expires 响应过期时间   Expires:Thu,15 Apr  2019  20:00:00  GMT;   在这个时间之内相同的请求使用缓存,这个时间之外使用http请求。
 *                 注意:Expires 使用一个固定的时间,要求服务器与客户端的时钟保持严格的同步,到期后,服务器还得重新设定新的时间。
 *           Cache-Control  通用消息头  Cathe-Control:max-age=315360000
 *                 注意:使用max-age指定组件被缓存多久,从请求开始在max-age时间内浏览器使用缓存,之外的使用请求,这样就可以消除Expires的限制。
 *                 max-age缺陷:max-age=<seconds>
 *                      如果在max-age时间内,服务器文件有修改,这样用户就不能第一时间获取最新信息,因此可以通过修改请求文件名,但为了确保用户能获取组件最新版本,
 *                  需要在整个项目中修改组件的文件名。 
 *          区别:
 *              1.Cache-Control用于控制HTTP缓存
 *              2.Expires 表示存在时间,允许客户端在这个时间之前不去发请求,相当于max-age效果,如果同时存在,则被Cache-Control的max-age覆盖
 *      4. Gzip Components–使用gzip压缩内容.
 *          请求头:Accept-Encoding: gzip, deflate
 *          响应头:Content-Encoding: gzip
 *      5. Put StyleSheets at the Top–把CSS放到顶部.
 *          浏览器是逐步加载页面,当放在底部,会禁止在许多浏览器中逐步渲染,这些浏览器会阻止渲染,以避免在样式发生变化时重绘页面元素
 *      6. Put Scripts at the Bottom–把JS放到底部.
 *          放上面可能引发的问题: 
 *              1.DOM操作可能获取不到DOM元素。
 *              2.js报错页面不出来。
 *      7. Avoid CSS Expressions–避免使用CSS表达式.
 *          背景颜色设置为每小时交替: background-color:expression((new Date()).getHours()%2?"#B8D4FF":"#F08A00");
 *          问题:不仅在页面呈现和调整大小时评估,在页面滚动甚至鼠标悬停时也会评估,所以使用cssbiao'da
 *          解决方法:使用一次性表达式,如果必须在页面的整个生命周期中动态设置样式属性,则使用事件处理程序而不是css表达式
 *      8. Make JavaScript and CSS External–将CSS和JS放到外部文件中.
 *          问题:每次请求HTML文档时,都会下载文档中内联的js和css。这虽然减少了所需的HTTP请求数,但增加了HTML大小。
 *          优点:1.浏览器会缓存外部css和js文件。2.HTML文档大小减少,且不会增加HTTP请求数量。
 *          注意:雅虎建议首页用内联js和css,会导致更快的最终用户响应时间
 *               对于多个页面具有代表性的首页,可以在首页中内联js和css,但在页面加载完成后动态下载外部文件。后续页面将引用已存在的浏览器缓存的外部文件
 *      9. Reduce DNS Lookups–减少DNS查找次数.
 *          DNS通常需要20-120毫秒才能查找给定主机名的IP地址。在DNS查找完成之前,浏览器无法从此主机名下载任何内容
 *          注意:1.默认情况下,Internet Explorer将DNS查找缓存30分钟,如DnsCacheTimeout注册表设置所指定。 
 *                  Firefox缓存DNS查找1分钟,由network.dnsCacheExpiration配置设置控制。 (Fasterfox将此更改为1小时。)
 *               2.减少唯一主机名的数量有可能减少页面中发生的并行下载量。 避免DNS查找会缩短响应时间,但减少并行下载可能会缩短响应时间。 
 *                  我的准则是将这些组件分成至少两个但不超过四个主机名。 这导致在减少DNS查找和允许高度并行下载之间的良好折衷。
 *      10. Minify JavaScript and CSS–压缩CSS和JS.
 *      11. Avoid Redirects–避免重定向.
 *          301/302状态码
 *          注意:要记住的主要事情是重定向会降低用户体验。 在用户和HTML文档之间插入重定向会延迟页面中的所有内容,
 *              因为页面中的任何内容都无法呈现,并且在HTML文档到达之前不会开始下载任何组件。
 *          example:在URL中缺少尾部斜杠(/)时,会产生一个301重定向
 *      12. Remove Duplicate Scripts–删除重复的JS.
 *          重复的js会损害性能:1.生成浪费的HTTP请求2.浪费多次评估脚本时间(是否可缓存)
 *      13. Configure ETags–配置ETags.
 *          注意:
 *              1.可以更加精确地判断资源是否被修改,因为它不是一个时间值,而是对时间经过处理的一个长整型数值(当然具体算法我们目前还不得而知)
 *              2.浏览器发起新请求时需要包含 If-None-Match
 *      14. Make AJAX Cacheable–使AJAX可缓存.
 *                 缓存规则适用于ajax:
 *                    Gzip Components
 *                    Reduce DNS Lookups
 *                    Minify JavaScript
 *                    Avoid Redirects
 *                    Configure ETags
 *                      这可以通过向地址簿Ajax URL添加时间戳来实现,该时间戳指示用户上次修改地址簿的时间,例如,&t=1190241612。如果地址簿自上次下载后未被修改,则时间戳将相同,地址簿将从浏览器缓存中读取,从而消除额外的HTTP往返。
 *                 如果用户修改了地址簿,时间戳将确保新的URL与缓存的响应不匹配,浏览器将请求更新的地址簿条目。
 *      16. Use GET for AJAX Requests–使用GET来完成AJAX请求.
 *              在使用xmlhttprequest时:post---先发送请求头,然后发送数据
 *          只请求数据时,最好用get
 *      17. Post-load Components-延迟载入组件
 *          必须确保页面即使没有javascript也能正常工作。js进一步装饰
 *      18. Preload Components-预载入组件 
 *              预加载看起来可能与后加载相反,但实际上它有一个不同的目标。通过预加载组件,您可以利用浏览器空闲的时间,请求将来需要的组件(如图像、样式和脚本)。
 *          这样,当用户访问下一个页面时,您可以将大部分组件都保存在缓存中,并且您的页面将更快地为用户加载。 
 *      19. Reduce the Number of DOM Elements–减少DOM元素数量.
 *          复杂的页面意味着要下载更多的字节,它还意味着在JavaScript中访问DOM的速度较慢
 *          查看页面中DOM元素数量(document.getElementsByTagName('*').length)
 *      20. Reduce Cookie Size–减少Cookie的大小.
 *              HTTP cookie的使用有多种原因,例如身份验证和个性化。有关cookie的信息在Web服务器和浏览器之间的HTTP头中交换。
 *          保持尽可能小的cookie大小以最小化对用户响应时间的影响是很重要的。 
 *              规则:
 *                  1.消除不必要的cookie              
 *                  2.尽可能减小cookie的大小,以最大限度地减少对用户响应时间的影响。              
 *                  3.注意在适当的域级别设置cookie,这样其他子域就不会受到影响。              
 *                  4.适当地设置到期日期。较早的到期日期或“无”会更快地删除cookie,从而提高用户响应时间 
 *      21. Use Cookie-Free Domains for Components–使用无cookie的域.
 *              如果您的域是www.example.org,那么您可以在static.example.org上托管静态组件。但是,如果您已经在*域example.org上设置了cookie,而不是www.example.org,那么对static.example.org的所有请求都将包括这些cookie。
 *          在这种情况下,您可以购买一个全新的域,在那里托管静态组件,并保持这个域cookie是免费的。
 *              在无cookie域上托管静态组件的另一个好处是,某些代理可能会拒绝缓存用cookie请求的组件。在相关的注释中,如果您想知道您的主页是否应该使用example.org或www.example.org,请考虑cookie的影响。省略www会使您别无选择,
 *          只能将cookie写入*.example.org,因此出于性能原因,最好使用www子域并将cookie写入该子域。 
 *      22. Minimize DOM Access-最小化DOM访问
 *          js操作DOM比较慢,可以缓存已经访问过的元素
 *      23.Develop Smart Event Handlers-开发智能呢个的事件处理程序
 *          事件委托代替多个事件处理程序
 *      24. Avoid Filters–避免使用滤镜. 旨在解决IE版本<7的半透明真彩色PNG的问题。
 *      25. Optimize Images-优化图片  
 *          能用png不用gif
 *      26. Optimize CSS Sprites-优化精灵图
 *          I.与垂直排列相比,水平排列sprite中的图像通常会导致较小的文件大小
 *          II.不要在精灵中的图像之间留下大的空白
 *      27.Don't Scale Images in HTML-不要在HTML中缩放图像 
 *          不要因为可以用HTML设置宽度和高度而使用比需要的大的图像。如果你需要的话              
 *          <img width=“100”height=“100”src=“my cat.jpg”alt=“my cat”/>              
 *          那么您的图像(mycat.jpg)应该是100x100px,而不是缩小的500x500px图像。
 *      28. Make favicon.ico Small and Cacheable–缩小favicon.ico并缓存.
 *      29. Avoid empty src –避免空src.
 *          straight HTML
 *              <img src="">
 *          JavaScript
 *              var img = new Image();
 *              img.src = "";
 *          这两种表单都会产生相同的效果:浏览器向服务器发出另一个请求->            
 *              Internet Explorer向页面所在的目录发出请求。              
 *              Safari和Chrome向实际页面本身发出请求。              
 *              firefox 3和早期版本的行为与safari和chrome相同,但3.5版解决了这个问题[bug 444931],不再发送请求。              
 *              当遇到空的image-src时,opera不执行任何操作。 
 *          造成的影响:
 *              I.通过发送大量的意外流量,尤其是对于每天获得数百万页面浏览量的页面,会使服务器瘫痪。              
 *              II.浪费服务器计算周期,生成永远无法查看的页面。              
 *              III.可能已损坏用户数据。如果您正在通过cookie或其他方式跟踪请求中的状态,则有可能破坏数据。
 *           即使图像请求不返回图像,浏览器也会读取并接受所有头文件,包括所有cookie。当剩余的响应被丢弃时,可能已经造成了损害。 
 * */