首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

前端工程打开速度优化的稳中求进总结

2013-07-04 
前端工程打开速度优化的循序渐进总结创建人:@郑昀更新日期:2013年5月8日 分类: 前端技术?优化的重要指标:

前端工程打开速度优化的循序渐进总结
创建人:@郑昀更新日期:2013年5月8日 分类: 前端技术?优化的重要指标:页面打开速度(Fully Loaded)网站首页(或列表页)之 First View :打开速度应在 3秒+0.5秒 内;对 Repeat View 时的各项指标暂不作要求;首屏打开时间(Start Render)网站首页(或列表页) 之 First View?:首屏渲染速度应在 1秒+0.5秒 内;文档解析完毕时间(Document Complete):对此指标暂不作要求。指标测试方法参考附录A。提纲:

    遵循常规优化建议外联内联js/css的位置摆放建议combo handler的引入图片无损压缩的优化减少 dom elements 的数量引入 textarea/script 元素做延迟解析异步渲染
优化第一阶段:遵循常规优化建议本阶段所使用工具参考附录B。常规优化建议:
    javascript 外联文件引用放在 html 文档底部:具体如何摆放内联JS/CSS和外联JS/CSS,请参考 优化第二阶段;css 外联文件引用在 html 文档头部:位于 header 内;http 静态资源尽量用多个子域名:充分利用现代浏览器的多线程并发下载能力。浏览器的多线程下载能力,参考 附录C;
具体建议:JS、CSS、CSS背景图片、CSSSprite图片分散在 s0~s2.55tuanimg.com 下;业务类图片分散在 p0~p3.55tuanimg.com 下;服务器端提供 html 文档和 http 静态资源时,尽量开启 gzip 压缩;json/xml 等格式的文本响应,也建议开启 gzip ;jepg/png 等图片,可以选择不开启 gzip,因为可能服务器端图片无损压缩算法已经很强悍了,不需要依赖于 gzip;在 js、css、image 等资源响应的 http headers 里,设置 expires、last-modified;含义参考 附录D;郑昀实例示范:Nginx设置示范:

location ~ .*\.(js|css)${

expires 30d;

}

location ~ .*\.(gif|jpg|jpeg|png|bmp)${

expires 1M;

}

尽量减少 HTTP Requests 的数量;通过 combo handler 合并 js 和 css 的下载,参考 优化第三阶段;本阶段请尽量减少外联 js/css 文件数,尽量减少 ajax 调用;js/css 的 minify:可统一通过 combo handler 做到压缩加合并;减少不必要的 301/302 跳转:别让页面打开时间浪费在302多次跳转上(每次可能几十毫秒);请大量使用 CSS Sprites:这样做可以大大地减少CSS背景图片的HTTP请求次数;首屏不需要展示的较大尺寸图片,请使用 LazyLoad获取也非常简单:前端工程打开速度优化的稳中求进总结据yiminghe介绍,对 于屏幕外延迟渲染的 html 存放在隐藏(visibility:hidden)的 textarea 中,并且该 textarea 占据本该渲染的位置,监控窗体滚动,当textarea进入可见区域,将该 textarea 内的 value, 插入到 textarea 之前,并删除掉 textarea?。?这样,把大量不需要在首屏展示的html代码分模块放入一个一个的 textarea 里,大大减少了DOM节点数,从而给浏览器合理的喘息(UI Update)时间,等首屏真正在显示器上绘制出来后,再得到 textarea.value ,填充回 DOM Tree。?textarea+datalazyload,相对于其他延迟加载异步渲染解决方案,最大好处,还是减少首屏绘制时的DOM节点总数。?参考资料:玉伯(王保平,id@lifesinger)《淘宝详情页的 BigRender 优化与存放大块 HTML 内容的最佳方式》BigRender所依赖的“数据延迟加载组件”datalazyloadyiminghe《数据延迟加载组件》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 id="goodsAll_info" ?style="display:none;"></textarea>的隐藏 textarea 里了。然后在 html 文档底部,放内联 js 来读取:<script type="text/javascript">$(function(){var area = document.getElementById("goodsAll_info").value;document.getElementById("goodsAll_info_div").innerHTML = area;});</script>???
?附录A:页面打开速度和首屏打开时间的测量推荐工具:
    推荐使用?http://www.webpagetest.org/?评测,由于它受限于并发测试和带宽,所以资源下载速度较差,只能作为与竞争对手对比测试的依据;
Test Location 请选择亚洲的中国江苏节点;Browser 请选择 Firefox、IE9、Chrome等现代浏览器;如下图所示:郑昀运维部的每周博睿检测数据报告,我们以博睿的数据为准;博睿从它的各地监测节点以及不同电信链路访问,得到一个响应速度的平均值;Google PageSpeed?https://developers.google.com/speed/pagespeed/insights?的 Critical Path Explorer;附录B:能提出常规优化建议的工具推荐工具:
    Firefox插件 YSlow! ;Google PageSpeed?https://developers.google.com/speed/pagespeed/insights?;
附录C:浏览器多线程下载能力一览参考怪飞的文章《各浏览器的并行连接数(同域名)?》:BrowserHTTP/1.1HTTP/1.0IE 6,724IE 866Firefox 3+66Safari 3+44Chrome 3+44Chrome 11+6?Opera 10+44Opera 11+16?附录D:expires和last-modified概念1)Expires给出的日期/时间后,被响应认为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。2)Last-Modified和ExpiresLast-Modified标识能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标 识却使得浏览器干脆连HTTP请求都不用发,比如当用户F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP 请求出去,所以,Last-Modified还是要用的,而 且要和Expires一起用。?赠图一枚:@正和岛标准 :【看图】做事感觉特别困难的时候,可能收获也会特别巨大。?@烈火在线:每次看产品经理发来的文档,都是这种感觉。。。

热点排行