前端工程打开速度优化的循序渐进总结.docx_第1页
前端工程打开速度优化的循序渐进总结.docx_第2页
前端工程打开速度优化的循序渐进总结.docx_第3页
前端工程打开速度优化的循序渐进总结.docx_第4页
前端工程打开速度优化的循序渐进总结.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前端工程打开速度优化的循序渐进总结创建人:郑昀优化的重要指标: 页面打开速度(Fully Loaded) 网站首页(或列表页)之 First View :打开速度应在 3秒+0.5秒 内; 对 Repeat View 时的各项指标暂不作要求; 首屏打开时间(Start Render) 网站首页(或列表页) 之 First View:首屏渲染速度应在 1秒+0.5秒 内; 文档解析完毕时间(Document Complete): 对此指标暂不作要求。指标测试方法参考附录A。提纲:1. 遵循常规优化建议2. 外联内联js/css的位置摆放建议3. combo handler的引入4. 图片无损压缩的优化5. 减少 dom elements 的数量6. 引入 textarea/script 元素做延迟解析异步渲染优化第一阶段:遵循常规优化建议本阶段所使用工具参考附录B。常规优化建议:1. javascript 外联文件引用放在 html 文档底部:具体如何摆放内联JS/CSS和外联JS/CSS,请参考 优化第二阶段;2. css 外联文件引用在 html 文档头部:位于 header 内;3. http 静态资源尽量用多个子域名:充分利用现代浏览器的多线程并发下载能力。浏览器的多线程下载能力,参考 附录C; 具体建议: JS、CSS、CSS背景图片、CSSSprite图片分散在 下; 业务类图片分散在 下;4. 服务器端提供 html 文档和 http 静态资源时,尽量开启 gzip 压缩; json/xml 等格式的文本响应,也建议开启 gzip ; jepg/png 等图片,可以选择不开启 gzip,因为可能服务器端图片无损压缩算法已经很强悍了,不需要依赖于 gzip;5. 在 js、css、image 等资源响应的 http headers 里,设置 expires、last-modified; 含义参考 附录D; 郑昀实例示范: Nginx设置示范:location .*.(js|css)$expires 30d;location .*.(gif|jpg|jpeg|png|bmp)$expires 1M;6. 尽量减少 HTTP Requests 的数量; 通过 combo handler 合并 js 和 css 的下载,参考 优化第三阶段; 本阶段请尽量减少外联 js/css 文件数,尽量减少 ajax 调用;7. js/css 的 minify:可统一通过 combo handler 做到压缩加合并;8. 减少不必要的 301/302 跳转:别让页面打开时间浪费在302多次跳转上(每次可能几十毫秒);9. 请大量使用 CSS Sprites:这样做可以大大地减少CSS背景图片的HTTP请求次数;10. 首屏不需要展示的较大尺寸图片,请使用 LazyLoad;11. 避免404错误:请求一个外联 js 失败时获得的404错误,不但会堵塞并行的下载,而且浏览器会尝试分析404响应的内容,来辨识它是否是有用的Javascript代码;12. 减少 cookies 的大小:尽量减少 cookies 的体积对减少用户获得响应的时间十分重要; 去除不必要的 cookie; 尽量减少 cookie 的大小; 留心将 cookie 设置在适当的域名下,避免影响到其他网站; 设置适当的过期时间。一个较早的过期时间或者不设置过期时间会更快地删除 cookie,从而减少响应时间。13. 使用无 cookies 的域: 当浏览其请求一个静态图片并一同发送 cookie 时,服务器并不需要这些 cookies 。这样只是毫无益处地创建了多余的网络流量。应当保证静态资源在请求时没有携带 cookies,所以需要把你的静态资源放在另一个子域名下。 如果你的域名是 ,你可以将你的静态资源放在 中。如果你把 cookie 设置在顶级域名 上而不是 ,那么所有发送至 的请求会包括那些 cookies。在 这种情况下,你可以用一个全新的没有 cookie 的域名来放置你的静态资源。14. 避免使用 javascript 来定位布局;优化第二阶段:外联内联js/css的位置摆放建议玉伯定义的加载和阻塞三定律如下: 定律一:资源是否下载依赖 JS 执行结果JS 有可能会修改 DOM。典型的,可能会有document.write。这意味着,在当前 JS 加载和执行完成前,后续所有资源的下载有可能是没必要的。这是 JS 阻塞后续资源下载的根本原因。 定律二:JS 执行依赖 CSS 最新渲染JS 的执行有可能依赖最新样式。比如,可能会有var width = $(#id).width(). 这意味着,JS 代码在执行前,浏览器必须保证在此 JS 之前的所有 css(无论外链还是内嵌)都已下载和解析完成。这是 CSS 阻塞后续 JS 执行的根本原因。 定律三:现代浏览器存在 prefetch 优化现代浏览器在竞争中,在 UI update 线程之外,还会开启另一个线程,对后续 JS 和 CSS 提前下载(注意,仅提前下载,并不执行)。有了 prefetch 优化,这意味着,在不存在任何阻塞的情况下,理论上 JS 和 CSS 的下载时机都非常优先,和位置无关。根据三定律,郑昀认为:一,如果真的需要把外联js和css放在head里,那也需要从下面这种排序1.外联js2.外联css3.外联js统一为:1.外联css2.外联js3.外联js不要script和css交替混编。原因是,据有人称:从Firefox 4+开始,对prefetch的策略有些许调整,调整在于head中css与js的位置。css在外联js后面时,可能会在script后面的css加载好之前,提前进行首次渲染。然后等后面的css加载好后,再次更新Render Tree并进行渲染,造成页面闪烁现象。即,各种优化策略,似乎随着浏览器版本不同,头可能发生细微差异。所以郑昀认为,保守做法是,js和css不要在head里交替混编,统一为先外联css再外联js!二,但只有万不得已时,才会在 head 里放外联js,否则请把外联js放置到前。原因是张克军的js和css的顺序关系指出: 只要 head 里出现外联js,无论如何放,css文件都不能和body里的请求并行。 body 里 dom 渲染取决于 head 里的js执行完。外联js放在页面最后,高级浏览器会自动做优化(prefetch),你不用担心,它也可能会提前下载。优化第三阶段:combo handler 的引入背景Combo Handler 是 Yahoo! 开发的一个 Apache 模块,它实现了开发人员简单方便地通过URL来合并JavaScript和CSS文件,从而大大减少文件请求数。目的它满足 Yahoo! 前端优化第一条原则:Minimize HTTP Requests,来减少三路握手和HTTP请求的发送次数。国内实例淘宝网首页meta里多个js合并的声明:js之间用英文逗号或&符号分隔。此src的Response是多个js文件的内容拼装。国内的 Combo Script 支持淘宝李晶-拔赤在 /jayli/combo 下发布了combo.php和minfy.php,能够做到合并文件(不压缩),以及合并且压缩。文件列表: - combo.php 合并文件,不压缩 - minify.php 合并压缩文件 - cssmin.php 压缩css - jsmin.php 压缩js - cb.php 淘宝CDN合并文件策略的模拟脚本使用: - 要求php5及以上版本 - 程序在找不到本地文件的情况下,会去指定的cdn上找同名文件 - 程序会自动转义-min文件为源文件,因此要约定-min文件和原文件要成对出现 - 需要定义combo.php和minify.php中的$YOUR_CDN变量 - 如果只是合并压缩local文件,则不必重置$YOUR_CDN变量 - 这里提供cb.php,用来实现tbcdn的开发环境的模拟,apache的配置在cb.php中CDN上的 Combo Handler支持1)2008年7月YUI Team宣布在YAHOO! CDN上对YUI JavaScript组件提供Combo Handler服务。2)淘宝CDN支持Combo Handler,用逗号分隔js/css,用两个问号来触发combo特性:- /?1.js,2.js- /subdir/?1/js,2.js用一个问号来添加时间戳,如:- /?fp/directpromo.js?t=2012062320120712为了避免 CDN 缓存错误的版本,combo上线的访问策略是:1)静态文件传到服务器端;2)部署人员使用线上静态文件服务器的IP地址直接请求combo服务,挨个儿combo请求一次;3)部署人员确认上面的请求都成功、内容无误后,再换成CDN地址再次请求,确保CDN缓存正确的文件内容。优化第四阶段:图片无损压缩的优化页面上的各种图片是否有优化的余地,推荐使用PageSpeed检测一下。下面的建议来自于冯凯。由于专卖店等各种业务上传的图片有 jpeg、png 和 gif 等格式,因此三种格式都需要优化:1)jpegtran和jpegoptim的压缩效果几乎完全相同。但jpegtran有progressive编码(渐进式的展示,先显示模糊的,再逐步清晰),而且通常(84%的概率)对于大图片(10k+)压缩比更高。虽然我们的大部分页面已经改成延迟加载了,但对于非延迟加载的页面,效果明显更好。经测试,pagespeed 并没有按照 progressive 方式提供建议。2)测试了png的几种压缩方式,压缩效果各异。测试的一张图片 optipng 只压缩了约5%,但其他几种达到了20%+经测试,pagespeed上给出的可压缩比例是按照optipng给出的。pngout据说采用了不同的编码,因此对小图片压缩效果更好。用imageoptim测试确实略优,但命令行上还没找到合适的调用参数。目前决定采用pngcrush。对于采用png8,以大幅压缩的方法,我们不做技术处理。3)gif就采用gifsicle做压缩。大部分情况下,我们不建议采用gif图片。对于单帧gif更应该用png格式替代。这里我们暂不考虑通过技术处理来吧单帧gif转换成png。4)采用php的exec调用shell脚本的方式来执行这些bin文件。参考资料: stoyan,image-optimization-for-the-web-at-phpworks-presentation,幻灯片; 老王,优化图片,2009;优化第五阶段:减少 DOM Elements 的数量据玉伯说,对于典型的淘宝商品详情页,经测试发现,每增加一个 DOM 节点,会导致首屏渲染时间延迟约 0.5ms。2011年时,我们首页一个商品节点包含了21个DOM节点,充满了大量的em、strong、span。所以前端开发部门必须与产品部交互设计人员积极沟通,而不仅仅是在她们提供的交互设计稿件上切图,必须在简化视觉元素和精简DOM节点上表达自己的意见。2012年,简化设计后,首页一个商品节点包含13个节点。优化第六阶段:引入 textarea/script 元素做延迟解析异步渲染textarea 延迟渲染原理据玉伯介绍,HTML 元素中有一种 RCDATA elements,含 textarea 和 title 。RCDATA指的是,Replaceable Character Data。如果用隐藏的 textarea 来存放 html 代码,textarea 中的内容会按照 RCDATA 规则来解析:1. 遇到 & 时,会尽可能得到实体字符。2. 遇到 ) 时,会结束解析。3. 其他都直接作为 textarea 的内容。获取也非常简单:据yiminghe介绍,对于屏幕外延迟渲染的 html 存放在隐藏(visibility:hidden)的 textarea 中,并且该 textarea 占据本该渲染的位置,监控窗体滚动,当textarea进入可见区域,将该 textarea 内的 value, 插入到 textarea 之前,并删除掉 textarea。这样,把大量不需要在首屏展示的html代码分模块放入一个一个的 textarea 里,大大减少了DOM节点数,从而给浏览器合理的喘息(UI Update)时间,等首屏真正在显示器上绘制出来后,再得到 textarea.value ,填充回 DOM Tree。textarea+datalazyload,相对于其他延迟加载异步渲染解决方案,最大好处,还是减少首屏绘制时的DOM节点总数。参考资料: 玉伯(王保平,idlifesinger)淘宝详情页的 BigRender 优化与存放大块 HTML 内容的最佳方式(需翻墙) BigRender所依赖的“数据延迟加载组件”datalazyload yiminghe数据延迟加载组件script 延迟渲染原理玉伯在淘宝详情页的 BigRender 优化与存放大块 HTML 内容的最佳方式中提到,与前面说的 textarea 存放 html 代码一样,你也可以用 script 来存放,目的都是减少 DOM 节点数。浏览器在拿到 html 代码时,首次 Tokenization Tree Construction 的速度就会大大加快。某网是怎么实践的在某网商品详情页上,HTML 文档底部遍布着这样的代码:注意这些 script 的 type 是 text/x-template ,这是YUI类库自己定义的元素type。你可以注意到,LABjs 也玩过这个小技巧,也是自己定义了一个元素 type“text/cache”, 由于浏览器不认识这种 type,就会主动忽略这个 HTML元素。什么时候取出这些隐藏HTML代码呢?那就要用到这些 script 的 id 了。YUI的教程上是这么获得 HTML 代码:template: Y.one(#todo-item-template).getHTML(),某网的做法是:比如id=search-path-markup的script,也是用Y.one来拿:然后用_6e.getContent()方法:某网由于走的是 YUI3.0 体系,所以可以利用 script 存放html代码技巧,让商品详情页首屏更快地渲染出来。我们的实践在商品详情页上,我们把很多不需要首屏渲染的 html 代码放入了类似于的隐藏 textarea 里了。然后在 html 文档底部,放内联 js 来读取:$(function()var area = document.getElementById(goodsAll_info).value;document.getElementById(goodsAll_info_div).innerHTML = area;);附录A:页面打开速度和首屏打开时间的测量推荐工具:1. 推荐使用/评测,由于它受限于并发测试和带宽,所以资源下载速度较差,只能作为与竞争对手对比测试的依据; Test Location 请选择亚洲的中国江苏节点; Browser 请选择 Firefox、IE9、Chrome等现代浏览器; 如下图所示: 郑昀2. 运维部的每周博睿检测数据报告,我们以博睿的数据为准; 博睿从它的各地监测节点以及不同电信链路访问,得到一个响应速度的平均值;3. Google PageSpeed/speed/pagespeed/i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论