SlideShare ist ein Scribd-Unternehmen logo
1 von 81
PC 制作部网速组
慢 500ms = 20%  将放弃访问 (Google) 慢 400ms = 5-9%  将放弃访问 (Yahoo!) 慢 100ms = 1%  将放弃交易 (Amazon) we  2.97 s  they  1.67 s (2010.2.1--2010.3.1 ) 慢 1300 ms = ??%  将放弃访问 http://www.slideshare.net/stubbornella/after-yslow-a 我们?
20/80 法则 0.16 s 后端 20% ( jsp 、 Apache 、 hibernate 、 Nginx.......  )
20/80 法则 ∞  s 前端 80% ( js 、 css 、 images 、 <script></script> 、 jQuery....  )
我们的成果
Lady…
Let’s start!
我们关注的指标 #1 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 JS CSS 广告 解释、渲染
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 用户第一感受
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 未来关注的方向 页面复杂程度 真正的标准
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 波动不可避免 南北有差异 用户有差异
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 页面的原代码的体积 Pconline 375.6k/63.3k Pcauto  273.4k/49.6k Zol  349.8k/85.7k Autohome 320.0k/50.3k xxx  10.5k/4.4k
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 document.getElementsByTagName(&quot;*&quot;).length Pconline 7951 Pcauto  4975 Pclady  3474 Zol  2867 Autohome 4649 瑞丽  2860 VS 内容为王 ? 页面复杂程度  Reflow
首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 决定首屏显示速度
全面的监控体系 #2 基调网络 中国最大的第三网网络访问性能测试机构 监测点遍布全国各地 模拟用户真实感受 丰富的监控功能
基调能做的也是我们关注的
柱状图,看出与对手差距
历史曲线图,优化前后的对比
即时监测帮助了解个别页面的情况
我们的工具 #3
Httpwatch 概览、直观、易用
Dynatrace 深入、透彻、全面
浏览器会偷懒么? http://stevesouders.com/cuzillion/?c0=bi1hfff0_0_f&c1=bb0hfff0_2_f&c2=bi1hfff0_0_f&t=1271640890625 Dynatrace httpwatch
计算普通的布局 计算浮动的布局 安排布局任务 求 css 的值 输出 Rendering
Fiddler 本地调试必备,监测映射两不误
Y-slow YUI 页面效率黄金准则 PS :整合的图片优化功能很好用
Page speed Google 的页面效率准则
页面渲染过程 #4
渲染 3 4 5 6 7 计算的样式 <style> body{...} .wrap{...} .xx{...} .header{...} .content{...} </style> 渲染块 渲染块 渲染块 <div class=“xx”></div> <style> .xx{......;background:url( logo.jpg )} </style> <style> .... </style> <html> <div class=“xx”></div> <script></script> .... .... <style> content{...} </style> <ul></ul> </html> 1 2 8
三大优化 #5
A. 样式精简合并 新页面—— CSS 模块化:后期维护成本 操作习惯的改变  经验的总结归纳 旧页面—— CSS 提取: Dust-Me DOM 操作、动态页使得提取存在风险 ?  更好的工具 :更加细心
CSS 提取步骤: ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
注意事项: ,[object Object],[object Object],[object Object],[object Object]
B.Js 延迟 defineJS () 外链 js 用到时才请求 抵制浪费 各取所需
defineJS () : 同步: XMLhttprequest 不能跨域 默认 UTF-8 ,如 js 含有中文需改为 UTF-8 格式 异步: getElementsByTagName(&quot;head&quot;)[0].appendChild(js);  可以跨域 异步对页面不会阻塞 如果有用到监听函数的返回值,则需要改为同步方式  eg : jQuery defineJS(“ !$,!jQuery,!$.getScript = /www1/js/pc.jquery1.4.js ”);// 同步  defineJS(“ featuredcontentslider.init =1000: http://www1.pconline.com.cn/global/2008/js/contentslider.js ”); // 异步
defineJS 使用步骤 : ,[object Object],[object Object],[object Object],[object Object],[object Object]
defineJS () : javascript:alert(defineJSlog) 记录每个请求 js 的函数
$.lazy() : jQuery 插件的 defineJS var p='http://www1.pconline.com.cn/js/'; $. lazy ( { name:‘cluetip’, //jQuery 插件名 cache:true, // 是否缓存 src:p+‘jquery.cluetip.js’,// 插件地址 dependencies:// 插件依赖的资源 { js:[p+'jquery.hoverIntent.js'], css:[p+'jquery.cluetip.css'] } });  $. lazy ({name:'bt', cache:true, src:p+'jquery.bt.js'}); http://www.pconline.com.cn/www1/js/pc.jquery1.4.js
接口后出: var old_node=document.getElementById(&quot;old_node&quot;); var s=document.getElementById(&quot;new_node&quot;).getElementsByTagName(&quot;script&quot;); for(var i=0;i<s.length;i++){ s[0].parentNode.removeChild(s[0]);// 防止接口重复请求 } old_node .parentNode.replaceChild(document.getElementById(&quot; new_node &quot;), old_node ); <div id=&quot; new_node &quot;><script class=&quot; defer&quot; src=&quot;http://game.pcgames.com.cn/jsp/interface/item_piece_js.jsp?id=&quot;></script></div>  <div id=&quot;topTxt&quot;></div>  <div id=&quot;topTxt&quot;></div>  <div id=&quot; old_node &quot;></div>
setTimeout : <div id=&quot;topTxt&quot;></div>  <div id=&quot;topTxt&quot;></div>  if(window.ajaxLogon0906) ajaxLogon0906(); else  setTimeout (function(){ var js=document.createElement(&quot;script&quot;); js.src=&quot;http://www1.pconline.com.cn/global/2009/js/chalogon09.js&quot;; document.getElementsByTagName(&quot;head&quot;)[0].appendChild(js); },1000) // 登陆 js 后出 对于网速较慢的用户后出效果并不理想 比如汽车网首页品牌下拉框,当鼠标移上去时才初始化。一些不是一开始就需要的效果,可在  body.onload 里加载,为避免代码冲突,可以用下面的代码: if(window.attachEvent) document.body.attachEvent(&quot;onload&quot;,fn);  else document.body.addEventListener(&quot;load&quot;,fn);
普通调用事件化: <div id=&quot;topTxt&quot;></div>  <div id=&quot;topTxt&quot;></div>  if(window.attachEvent) document.body. attachEvent (&quot;onload&quot;,fn);  else document.body. addEventListener (&quot;load&quot;,fn); 比如汽车网首页品牌下拉框,当鼠标移上去时才初始化。一些不是一开始就需要的效果,可在  body.onload 里加载,为避免代码冲突,可以用下面的代码: 比如汽车网首页品牌下拉框,当鼠标移上去时才初始化。一些不是一开始就需要的效果,可在  body.onload 里加载,为避免代码冲突,可以用下面的代码: if(window.attachEvent) document.body.attachEvent(&quot;onload&quot;,fn);  else document.body.addEventListener(&quot;load&quot;,fn);
C. 广告后出
广告处理前: 请求多,且造成页面阻塞
广告处理后: 首屏没有广告请求和阻塞元素
<c:set var=&quot;combineAD&quot;> <body> ..... </body> </c:set> <cms: combineAD  insertBefore ='<div class=&quot;screen&quot; id=&quot;divScreen6&quot;>'>${combineAD}</cms:combineAD> ,[object Object],[object Object],[object Object]
广告请求 后出位置
更有效率的 JavaScript #6
js 是页面效率的噩梦!
var form=document.forms[0]; if(form.txtName.length==0){ alert(&quot; 用户名不能为空 &quot;); return false; } 以前
现在 ...
现在 ...
页面效率的问题 80% 由 js 引起
[object Object],[object Object],[object Object],[object Object],[object Object]
ECMAScript var divs=document.getElementsByTagName(&quot;div&quot;); for(var i=0;i< divs.length;i++){ } 缓存节点集合的长度,效率更高( ie 下快 60 倍) var divs=document.getElementsByTagName(&quot;div&quot;); for(var i=0, len=divs.length ;i<len;i++){ } 提高循环效率
减少对象查找 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
字符串合并 var reselt=“aaa”+”bbb”; 下面的代码效率更高,但不易维护,如果字符串相加操作量不大可不用以下方式 var buf=new Array(); buf.push(“aaa”); buf.push(“bbb”); var result=buf.join(“”); a += 'x' + 'y'; 后者比前者快 20% ,而且消耗更少的内存: a += 'x';  a += 'y';
var min = Math.min(a,b);  A.push(v); 下面代码实现相同功能,但效率更高: var min = a < b ? a : b;  A[A.length] = v; 还有 ... 基本运算符比函数调用更快
var original = document.getElementById('container');  var  cloned  = original. cloneNode (true); // 克隆节点,处理完后再替换原节点 cloned.setAttribute('width','50%');  var elem, contents;  for( var i = 0; i < textlist.length; i++ ) {     elem = document.createElement('p');     contents = document.createTextNode(textlist[i]);     elem.appendChild(contents);     cloned.appendChild(elem);  }  original.parentNode. replaceChild (cloned,original); DOM 元素处理尽量脱离 DOM 树 if(window.ajaxLogon0906) ajaxLogon0906(); else setTimeout(function(){ var js=document.createElement(&quot;script&quot;); js.src=“http://www1.pconline.com.cn/global/2009/js/chalogon09.js”;// 先设置 src ,再插入 document.getElementsByTagName(&quot;head&quot;)[0].appendChild(js); },1000)
var toChange = document.getElementById('mainelement');  toChange.style.background = '#333';  toChange.style.color = '#fff';  toChange.style.border = '1px solid #00f'; 通过修改元素  class  名使用新样式,效率更高, reflow 更少: div {     background: #ddd;     color: #000;     border: 1px solid #000;  }  div.highlight {     background: #333;     color: #fff;     border: 1px solid #00f;  }  ...  document.getElementById('mainelement').className = 'highlight'; 修改元素  class 名
document.getElementById('test').property1 = 'value1';  document.getElementById('test').property2 = 'value2';  document.getElementById('test').property3 = 'value3';  document.getElementById('test').property4 = 'value4'; 下面的代码比上面的代码要快 5-10 倍: var  sample  = document.getElementById('test');  sample .property1 = 'value1';  sample .property2 = 'value2';  sample .property3 = 'value3';  sample .property4 = 'value4'; 用变量保存 DOM 值
jQuery 选择符本质: $(“#id”) : document.getElementById(“id”);   // 快 $(“div”) : document.getElementsByTagName(“div”);  // 较慢 $(“.class”) : ?????  // 很慢很慢 var  all=document.getElementsByTagName(“ * ”); for(var i=0;i<all.length;i++){ if(all[i].className=“class”){ return all[i]; } } $(“.class”,$(“#id”))  // 好一些 jQuery 不要直接使用 class 作为选择符 http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ $(“#id”).addClass(“yyy”); $(“#id  ul”).show(); $(“#id ul li”).addClass(“xxx”); // 慢 var div=$(“#id”); div.addClass(“yyy”); $(“ul”,div).show(); $(“li”,div).addClass(“xxx”);
$(‘#traffic_light input.on).bind(’click‘, function(){…}); $(’#traffic_light input.on).css(‘border’, ‘3px dashed yellow’); $(‘#traffic_light input.on).css(’background-color‘, ‘orange‘); $(’#traffic_light input.on).fadeIn(’slow’); 将 jquery 对象缓存起来 http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ var $active_light = $(‘#traffic_light input.on’); $active_light.bind(‘click’, function(){…}); $active_light.css(‘border’, ‘3px dashed yellow’); $active_light.css(‘background-color’, ‘orange’); $active_light.fadeIn(’slow’); OR $(‘#traffic_light input.on’).bind(‘click’, function(){…}).css(‘border’, ‘3px dashed yellow’).css(‘background-color’, ‘orange’).fadeIn(’slow’);
$(document).rady 在 DOM 载入时执行,有可能会延迟不够,影响到页面的渲染 $(window).load  http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ $(window).load  在所有内容加载后触发,包括窗口,框架,对象和图像
不在首屏内使用 jQuery http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ 对于 jQuery 的优化会用到 defineJS 的延迟去加载,如果在首屏使用 jQuery ,会使 jQuery 的请求处在首屏,失去了延迟的意义 所以: 将 jQuery 的调用放到首屏后 或者 NO jQuery
还有什么? #7
Reflow  和 Repaint
图片按需加载 http://price.pcauto.com.cn/serial.jsp?sid=4523 http://product.pconline.com.cn/mobile/
CSS sprite ,[object Object],[object Object],[object Object]
减少图片大小重置 页面显示的大小 88x88 图片实际大小 232x232 ,[object Object],[object Object],http://www.chencheng.org/blog/2009/12/17/resized-image-checker/
CSS 选择符对页面的影响 1. 页面元素越多,渲染时间对页面速度的影响越明显。 2. 选择符从右至左匹配,最右边的选择符匹配效率最为关键。 http://stevesouders.com/efws/css-selectors/csscreate.php
不要使用 CSS Expression ,[object Object],[object Object],http://stevesouders.com/hpws/rule-expr.php ,[object Object]
浏览器还是服务器? json vs innerHTML
<base target=&quot;_blank&quot; /> ,[object Object],[object Object]
iframe 其中样式全内嵌 iframe 中的样式表引用同样会引起父页面假死和花屏!
并发 ie 中,同一个 script 中用 document.write 可以并发 // 并发 js 和 css <script> document.write(“a.css”); document.write(“b.js”); </script> // 并发 js 和 js <script> document.write(“a.js”); document.write(“b.js”); </script> 为保证模板在 DW 中的效果,样式表在 <head> 中写成 <c:set var=&quot;CSS&quot;> <link href=&quot;....&quot; rel=&quot;...&quot;/> </c:set> 然后在 body 中 ivy.js 的地方,写成 <script> document.write('${CSS}'); if(!window.addIvyID)document..... //ivy.js document.write(&quot;<script src= 头部 js></script>&quot;); </script>
探索还未结束 #8
IE6 下背景图加载顺序测试 <div style=&quot;background:url(bg.png)&quot;></div><img src=&quot;img1.jpg&quot;/> 很多图 <div style=&quot;background:url(bg.png)&quot;><img src=&quot;img1.jpg&quot;/><img src=&quot;img2.jpg&quot;/></div> <div style=&quot;background:url(bg.png)&quot;></div><img src=&quot;img1.jpg&quot;/><script></script><img src=&quot;img2.jpg&quot;/> 加载顺序 : img1.jpg >  很多图  > bg.png 加载顺序 : img1.jpg > bg.png > img2.jpg 加载顺序 : img1.jpg > bg.png > img2.jpg 初探 IE6 的内部机制
页面卡住不动了? |------------| |  图  |  |------------|  |  外链 Js  |  |------------|  |  内容  | |____________|
精简:舌签精简版 兼容:伪下拉框
The End

Weitere ähnliche Inhalte

Was ist angesagt?

如何实现登出按钮
如何实现登出按钮如何实现登出按钮
如何实现登出按钮LI Daobing
 
Responsive Web UI Design
Responsive Web UI DesignResponsive Web UI Design
Responsive Web UI Designjay li
 
AngularJS Sharing
AngularJS SharingAngularJS Sharing
AngularJS SharingTom Chen
 
Developer Student Clubs NUK - Web Fundamentals
Developer Student Clubs NUK - Web FundamentalsDeveloper Student Clubs NUK - Web Fundamentals
Developer Student Clubs NUK - Web FundamentalsJiaxuan Lin
 
Xsd培训资料
Xsd培训资料Xsd培训资料
Xsd培训资料彦波 叶
 
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当裕波 周
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门Xiujun Ma
 
HTML5移动应用开发分享会(PhoneGap)
HTML5移动应用开发分享会(PhoneGap)HTML5移动应用开发分享会(PhoneGap)
HTML5移动应用开发分享会(PhoneGap)amd6400
 
CSS 培训
CSS 培训CSS 培训
CSS 培训S S
 
Dive into Responsive Web Design
Dive into Responsive Web DesignDive into Responsive Web Design
Dive into Responsive Web Designcncuckoo
 
HTML5概览
HTML5概览HTML5概览
HTML5概览Adam Lu
 
揭秘Html5和Css3
揭秘Html5和Css3揭秘Html5和Css3
揭秘Html5和Css3Adam Lu
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3edanwade
 
Creating CSS Template with Barrie North
Creating CSS Template with Barrie NorthCreating CSS Template with Barrie North
Creating CSS Template with Barrie NorthJohn Coonen
 

Was ist angesagt? (16)

如何实现登出按钮
如何实现登出按钮如何实现登出按钮
如何实现登出按钮
 
Responsive Web UI Design
Responsive Web UI DesignResponsive Web UI Design
Responsive Web UI Design
 
AngularJS Sharing
AngularJS SharingAngularJS Sharing
AngularJS Sharing
 
Developer Student Clubs NUK - Web Fundamentals
Developer Student Clubs NUK - Web FundamentalsDeveloper Student Clubs NUK - Web Fundamentals
Developer Student Clubs NUK - Web Fundamentals
 
Xsd培训资料
Xsd培训资料Xsd培训资料
Xsd培训资料
 
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门
 
HTML5移动应用开发分享会(PhoneGap)
HTML5移动应用开发分享会(PhoneGap)HTML5移动应用开发分享会(PhoneGap)
HTML5移动应用开发分享会(PhoneGap)
 
CSS 培训
CSS 培训CSS 培训
CSS 培训
 
Dive into Responsive Web Design
Dive into Responsive Web DesignDive into Responsive Web Design
Dive into Responsive Web Design
 
HTML5概览
HTML5概览HTML5概览
HTML5概览
 
HTML5 Basic
HTML5 BasicHTML5 Basic
HTML5 Basic
 
揭秘Html5和Css3
揭秘Html5和Css3揭秘Html5和Css3
揭秘Html5和Css3
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3
 
Creating CSS Template with Barrie North
Creating CSS Template with Barrie NorthCreating CSS Template with Barrie North
Creating CSS Template with Barrie North
 
Web base 吴志华
Web base 吴志华Web base 吴志华
Web base 吴志华
 

Andere mochten auch

4. Parents as Supporters of the Curriculum
4. Parents as Supporters of the Curriculum4. Parents as Supporters of the Curriculum
4. Parents as Supporters of the CurriculumMaylene Morta
 
Descrição passo a passo do aparelho de Herbst com cantilever
Descrição passo a passo do aparelho de Herbst com cantileverDescrição passo a passo do aparelho de Herbst com cantilever
Descrição passo a passo do aparelho de Herbst com cantileverConsultório Particular
 
After Market Parts Explained
After Market Parts ExplainedAfter Market Parts Explained
After Market Parts Explainedimminentzit9986
 
Chicago skyline-sm.jpg 1
Chicago skyline-sm.jpg 1Chicago skyline-sm.jpg 1
Chicago skyline-sm.jpg 1John Castelli
 
ип дополнение кр 2
ип дополнение кр 2ип дополнение кр 2
ип дополнение кр 2Julia Korkina
 
Open source in government
Open source in governmentOpen source in government
Open source in governmentJoel Natividad
 
符合時代的介面設計潮流
符合時代的介面設計潮流符合時代的介面設計潮流
符合時代的介面設計潮流DesBear Li
 

Andere mochten auch (8)

4. Parents as Supporters of the Curriculum
4. Parents as Supporters of the Curriculum4. Parents as Supporters of the Curriculum
4. Parents as Supporters of the Curriculum
 
Descrição passo a passo do aparelho de Herbst com cantilever
Descrição passo a passo do aparelho de Herbst com cantileverDescrição passo a passo do aparelho de Herbst com cantilever
Descrição passo a passo do aparelho de Herbst com cantilever
 
governor
governorgovernor
governor
 
After Market Parts Explained
After Market Parts ExplainedAfter Market Parts Explained
After Market Parts Explained
 
Chicago skyline-sm.jpg 1
Chicago skyline-sm.jpg 1Chicago skyline-sm.jpg 1
Chicago skyline-sm.jpg 1
 
ип дополнение кр 2
ип дополнение кр 2ип дополнение кр 2
ип дополнение кр 2
 
Open source in government
Open source in governmentOpen source in government
Open source in government
 
符合時代的介面設計潮流
符合時代的介面設計潮流符合時代的介面設計潮流
符合時代的介面設計潮流
 

Ähnlich wie 让我们的页面跑得更快

揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍裕波 周
 
Html5css3 go.yeefe.com
Html5css3 go.yeefe.comHtml5css3 go.yeefe.com
Html5css3 go.yeefe.comtellyeefe
 
Collaboration On Rails
Collaboration On RailsCollaboration On Rails
Collaboration On RailsJesse Cai
 
Chicago EXPO Creating a Pure CSS Template in Joomla 1.5
Chicago EXPO Creating a Pure CSS Template in Joomla 1.5Chicago EXPO Creating a Pure CSS Template in Joomla 1.5
Chicago EXPO Creating a Pure CSS Template in Joomla 1.5compassdesign
 
口碑导航更换项目总结
口碑导航更换项目总结口碑导航更换项目总结
口碑导航更换项目总结liuzhitao2000
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3edanwade
 
Inside browser
Inside browserInside browser
Inside browsermysqlops
 
Css性能优化
Css性能优化Css性能优化
Css性能优化linxz
 
Denver CMS Expo Creating CSS template
Denver CMS Expo Creating CSS templateDenver CMS Expo Creating CSS template
Denver CMS Expo Creating CSS templatecompassdesign
 
Javascript 性能优化总结.docx
Javascript 性能优化总结.docxJavascript 性能优化总结.docx
Javascript 性能优化总结.docxbaixingfa
 
【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimizationtbosstraining
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践longhao
 
S(P)Aas081008
S(P)Aas081008S(P)Aas081008
S(P)Aas081008yiming he
 
FIM Media Player - BoxModel in Flash
FIM Media Player - BoxModel in FlashFIM Media Player - BoxModel in Flash
FIM Media Player - BoxModel in Flashqizhi20
 
Inside the-browser
Inside the-browserInside the-browser
Inside the-browserjy03845581
 
Inside the-browser
Inside the-browserInside the-browser
Inside the-browserjy03845581
 
十步学会用Css+Div建站
十步学会用Css+Div建站十步学会用Css+Div建站
十步学会用Css+Div建站yiditushe
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染Ailsa126
 

Ähnlich wie 让我们的页面跑得更快 (20)

揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍
 
Html5css3 go.yeefe.com
Html5css3 go.yeefe.comHtml5css3 go.yeefe.com
Html5css3 go.yeefe.com
 
Collaboration On Rails
Collaboration On RailsCollaboration On Rails
Collaboration On Rails
 
Chicago EXPO Creating a Pure CSS Template in Joomla 1.5
Chicago EXPO Creating a Pure CSS Template in Joomla 1.5Chicago EXPO Creating a Pure CSS Template in Joomla 1.5
Chicago EXPO Creating a Pure CSS Template in Joomla 1.5
 
口碑导航更换项目总结
口碑导航更换项目总结口碑导航更换项目总结
口碑导航更换项目总结
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3
 
Inside browser
Inside browserInside browser
Inside browser
 
Css性能优化
Css性能优化Css性能优化
Css性能优化
 
Denver CMS Expo Creating CSS template
Denver CMS Expo Creating CSS templateDenver CMS Expo Creating CSS template
Denver CMS Expo Creating CSS template
 
日新培训
日新培训日新培训
日新培训
 
Javascript 性能优化总结.docx
Javascript 性能优化总结.docxJavascript 性能优化总结.docx
Javascript 性能优化总结.docx
 
【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
 
S(P)Aas081008
S(P)Aas081008S(P)Aas081008
S(P)Aas081008
 
FIM Media Player - BoxModel in Flash
FIM Media Player - BoxModel in FlashFIM Media Player - BoxModel in Flash
FIM Media Player - BoxModel in Flash
 
Jsp讲义
Jsp讲义Jsp讲义
Jsp讲义
 
Inside the-browser
Inside the-browserInside the-browser
Inside the-browser
 
Inside the-browser
Inside the-browserInside the-browser
Inside the-browser
 
十步学会用Css+Div建站
十步学会用Css+Div建站十步学会用Css+Div建站
十步学会用Css+Div建站
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
 

让我们的页面跑得更快

  • 2. 慢 500ms = 20% 将放弃访问 (Google) 慢 400ms = 5-9% 将放弃访问 (Yahoo!) 慢 100ms = 1% 将放弃交易 (Amazon) we 2.97 s they 1.67 s (2010.2.1--2010.3.1 ) 慢 1300 ms = ??% 将放弃访问 http://www.slideshare.net/stubbornella/after-yslow-a 我们?
  • 3. 20/80 法则 0.16 s 后端 20% ( jsp 、 Apache 、 hibernate 、 Nginx....... )
  • 4. 20/80 法则 ∞ s 前端 80% ( js 、 css 、 images 、 <script></script> 、 jQuery.... )
  • 8. 我们关注的指标 #1 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数
  • 9. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 JS CSS 广告 解释、渲染
  • 10. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 用户第一感受
  • 11. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 未来关注的方向 页面复杂程度 真正的标准
  • 12. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 波动不可避免 南北有差异 用户有差异
  • 13. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 页面的原代码的体积 Pconline 375.6k/63.3k Pcauto 273.4k/49.6k Zol 349.8k/85.7k Autohome 320.0k/50.3k xxx 10.5k/4.4k
  • 14. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 document.getElementsByTagName(&quot;*&quot;).length Pconline 7951 Pcauto 4975 Pclady 3474 Zol 2867 Autohome 4649 瑞丽 2860 VS 内容为王 ? 页面复杂程度 Reflow
  • 15. 首屏阻塞元素 首屏时间 总下载时间 下载速度 基础页下载字节数 DOM 元素个数 首屏对象数 决定首屏显示速度
  • 16. 全面的监控体系 #2 基调网络 中国最大的第三网网络访问性能测试机构 监测点遍布全国各地 模拟用户真实感受 丰富的监控功能
  • 27. Y-slow YUI 页面效率黄金准则 PS :整合的图片优化功能很好用
  • 28. Page speed Google 的页面效率准则
  • 30. 渲染 3 4 5 6 7 计算的样式 <style> body{...} .wrap{...} .xx{...} .header{...} .content{...} </style> 渲染块 渲染块 渲染块 <div class=“xx”></div> <style> .xx{......;background:url( logo.jpg )} </style> <style> .... </style> <html> <div class=“xx”></div> <script></script> .... .... <style> content{...} </style> <ul></ul> </html> 1 2 8
  • 32. A. 样式精简合并 新页面—— CSS 模块化:后期维护成本 操作习惯的改变 经验的总结归纳 旧页面—— CSS 提取: Dust-Me DOM 操作、动态页使得提取存在风险 ? 更好的工具 :更加细心
  • 33.
  • 34.
  • 35. B.Js 延迟 defineJS () 外链 js 用到时才请求 抵制浪费 各取所需
  • 36. defineJS () : 同步: XMLhttprequest 不能跨域 默认 UTF-8 ,如 js 含有中文需改为 UTF-8 格式 异步: getElementsByTagName(&quot;head&quot;)[0].appendChild(js); 可以跨域 异步对页面不会阻塞 如果有用到监听函数的返回值,则需要改为同步方式 eg : jQuery defineJS(“ !$,!jQuery,!$.getScript = /www1/js/pc.jquery1.4.js ”);// 同步 defineJS(“ featuredcontentslider.init =1000: http://www1.pconline.com.cn/global/2008/js/contentslider.js ”); // 异步
  • 37.
  • 38. defineJS () : javascript:alert(defineJSlog) 记录每个请求 js 的函数
  • 39. $.lazy() : jQuery 插件的 defineJS var p='http://www1.pconline.com.cn/js/'; $. lazy ( { name:‘cluetip’, //jQuery 插件名 cache:true, // 是否缓存 src:p+‘jquery.cluetip.js’,// 插件地址 dependencies:// 插件依赖的资源 { js:[p+'jquery.hoverIntent.js'], css:[p+'jquery.cluetip.css'] } }); $. lazy ({name:'bt', cache:true, src:p+'jquery.bt.js'}); http://www.pconline.com.cn/www1/js/pc.jquery1.4.js
  • 40. 接口后出: var old_node=document.getElementById(&quot;old_node&quot;); var s=document.getElementById(&quot;new_node&quot;).getElementsByTagName(&quot;script&quot;); for(var i=0;i<s.length;i++){ s[0].parentNode.removeChild(s[0]);// 防止接口重复请求 } old_node .parentNode.replaceChild(document.getElementById(&quot; new_node &quot;), old_node ); <div id=&quot; new_node &quot;><script class=&quot; defer&quot; src=&quot;http://game.pcgames.com.cn/jsp/interface/item_piece_js.jsp?id=&quot;></script></div> <div id=&quot;topTxt&quot;></div> <div id=&quot;topTxt&quot;></div> <div id=&quot; old_node &quot;></div>
  • 41. setTimeout : <div id=&quot;topTxt&quot;></div> <div id=&quot;topTxt&quot;></div> if(window.ajaxLogon0906) ajaxLogon0906(); else setTimeout (function(){ var js=document.createElement(&quot;script&quot;); js.src=&quot;http://www1.pconline.com.cn/global/2009/js/chalogon09.js&quot;; document.getElementsByTagName(&quot;head&quot;)[0].appendChild(js); },1000) // 登陆 js 后出 对于网速较慢的用户后出效果并不理想 比如汽车网首页品牌下拉框,当鼠标移上去时才初始化。一些不是一开始就需要的效果,可在 body.onload 里加载,为避免代码冲突,可以用下面的代码: if(window.attachEvent) document.body.attachEvent(&quot;onload&quot;,fn); else document.body.addEventListener(&quot;load&quot;,fn);
  • 42. 普通调用事件化: <div id=&quot;topTxt&quot;></div> <div id=&quot;topTxt&quot;></div> if(window.attachEvent) document.body. attachEvent (&quot;onload&quot;,fn); else document.body. addEventListener (&quot;load&quot;,fn); 比如汽车网首页品牌下拉框,当鼠标移上去时才初始化。一些不是一开始就需要的效果,可在 body.onload 里加载,为避免代码冲突,可以用下面的代码: 比如汽车网首页品牌下拉框,当鼠标移上去时才初始化。一些不是一开始就需要的效果,可在 body.onload 里加载,为避免代码冲突,可以用下面的代码: if(window.attachEvent) document.body.attachEvent(&quot;onload&quot;,fn); else document.body.addEventListener(&quot;load&quot;,fn);
  • 46.
  • 50. var form=document.forms[0]; if(form.txtName.length==0){ alert(&quot; 用户名不能为空 &quot;); return false; } 以前
  • 54.
  • 55. ECMAScript var divs=document.getElementsByTagName(&quot;div&quot;); for(var i=0;i< divs.length;i++){ } 缓存节点集合的长度,效率更高( ie 下快 60 倍) var divs=document.getElementsByTagName(&quot;div&quot;); for(var i=0, len=divs.length ;i<len;i++){ } 提高循环效率
  • 56.
  • 57. 字符串合并 var reselt=“aaa”+”bbb”; 下面的代码效率更高,但不易维护,如果字符串相加操作量不大可不用以下方式 var buf=new Array(); buf.push(“aaa”); buf.push(“bbb”); var result=buf.join(“”); a += 'x' + 'y'; 后者比前者快 20% ,而且消耗更少的内存: a += 'x'; a += 'y';
  • 58. var min = Math.min(a,b); A.push(v); 下面代码实现相同功能,但效率更高: var min = a < b ? a : b; A[A.length] = v; 还有 ... 基本运算符比函数调用更快
  • 59. var original = document.getElementById('container'); var cloned = original. cloneNode (true); // 克隆节点,处理完后再替换原节点 cloned.setAttribute('width','50%'); var elem, contents; for( var i = 0; i < textlist.length; i++ ) {    elem = document.createElement('p');    contents = document.createTextNode(textlist[i]);    elem.appendChild(contents);    cloned.appendChild(elem); } original.parentNode. replaceChild (cloned,original); DOM 元素处理尽量脱离 DOM 树 if(window.ajaxLogon0906) ajaxLogon0906(); else setTimeout(function(){ var js=document.createElement(&quot;script&quot;); js.src=“http://www1.pconline.com.cn/global/2009/js/chalogon09.js”;// 先设置 src ,再插入 document.getElementsByTagName(&quot;head&quot;)[0].appendChild(js); },1000)
  • 60. var toChange = document.getElementById('mainelement'); toChange.style.background = '#333'; toChange.style.color = '#fff'; toChange.style.border = '1px solid #00f'; 通过修改元素 class 名使用新样式,效率更高, reflow 更少: div {    background: #ddd;    color: #000;    border: 1px solid #000; } div.highlight {    background: #333;    color: #fff;    border: 1px solid #00f; } ... document.getElementById('mainelement').className = 'highlight'; 修改元素 class 名
  • 61. document.getElementById('test').property1 = 'value1'; document.getElementById('test').property2 = 'value2'; document.getElementById('test').property3 = 'value3'; document.getElementById('test').property4 = 'value4'; 下面的代码比上面的代码要快 5-10 倍: var sample = document.getElementById('test'); sample .property1 = 'value1'; sample .property2 = 'value2'; sample .property3 = 'value3'; sample .property4 = 'value4'; 用变量保存 DOM 值
  • 62. jQuery 选择符本质: $(“#id”) : document.getElementById(“id”); // 快 $(“div”) : document.getElementsByTagName(“div”); // 较慢 $(“.class”) : ????? // 很慢很慢 var all=document.getElementsByTagName(“ * ”); for(var i=0;i<all.length;i++){ if(all[i].className=“class”){ return all[i]; } } $(“.class”,$(“#id”)) // 好一些 jQuery 不要直接使用 class 作为选择符 http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ $(“#id”).addClass(“yyy”); $(“#id ul”).show(); $(“#id ul li”).addClass(“xxx”); // 慢 var div=$(“#id”); div.addClass(“yyy”); $(“ul”,div).show(); $(“li”,div).addClass(“xxx”);
  • 63. $(‘#traffic_light input.on).bind(’click‘, function(){…}); $(’#traffic_light input.on).css(‘border’, ‘3px dashed yellow’); $(‘#traffic_light input.on).css(’background-color‘, ‘orange‘); $(’#traffic_light input.on).fadeIn(’slow’); 将 jquery 对象缓存起来 http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ var $active_light = $(‘#traffic_light input.on’); $active_light.bind(‘click’, function(){…}); $active_light.css(‘border’, ‘3px dashed yellow’); $active_light.css(‘background-color’, ‘orange’); $active_light.fadeIn(’slow’); OR $(‘#traffic_light input.on’).bind(‘click’, function(){…}).css(‘border’, ‘3px dashed yellow’).css(‘background-color’, ‘orange’).fadeIn(’slow’);
  • 64. $(document).rady 在 DOM 载入时执行,有可能会延迟不够,影响到页面的渲染 $(window).load http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ $(window).load 在所有内容加载后触发,包括窗口,框架,对象和图像
  • 65. 不在首屏内使用 jQuery http://blog.dynatrace.com/2009/11/09/101-on-jquery-selector-performance/ 对于 jQuery 的优化会用到 defineJS 的延迟去加载,如果在首屏使用 jQuery ,会使 jQuery 的请求处在首屏,失去了延迟的意义 所以: 将 jQuery 的调用放到首屏后 或者 NO jQuery
  • 67. Reflow 和 Repaint
  • 69.
  • 70.
  • 71. CSS 选择符对页面的影响 1. 页面元素越多,渲染时间对页面速度的影响越明显。 2. 选择符从右至左匹配,最右边的选择符匹配效率最为关键。 http://stevesouders.com/efws/css-selectors/csscreate.php
  • 72.
  • 74.
  • 75. iframe 其中样式全内嵌 iframe 中的样式表引用同样会引起父页面假死和花屏!
  • 76. 并发 ie 中,同一个 script 中用 document.write 可以并发 // 并发 js 和 css <script> document.write(“a.css”); document.write(“b.js”); </script> // 并发 js 和 js <script> document.write(“a.js”); document.write(“b.js”); </script> 为保证模板在 DW 中的效果,样式表在 <head> 中写成 <c:set var=&quot;CSS&quot;> <link href=&quot;....&quot; rel=&quot;...&quot;/> </c:set> 然后在 body 中 ivy.js 的地方,写成 <script> document.write('${CSS}'); if(!window.addIvyID)document..... //ivy.js document.write(&quot;<script src= 头部 js></script>&quot;); </script>
  • 78. IE6 下背景图加载顺序测试 <div style=&quot;background:url(bg.png)&quot;></div><img src=&quot;img1.jpg&quot;/> 很多图 <div style=&quot;background:url(bg.png)&quot;><img src=&quot;img1.jpg&quot;/><img src=&quot;img2.jpg&quot;/></div> <div style=&quot;background:url(bg.png)&quot;></div><img src=&quot;img1.jpg&quot;/><script></script><img src=&quot;img2.jpg&quot;/> 加载顺序 : img1.jpg > 很多图 > bg.png 加载顺序 : img1.jpg > bg.png > img2.jpg 加载顺序 : img1.jpg > bg.png > img2.jpg 初探 IE6 的内部机制
  • 79. 页面卡住不动了? |------------| | 图 | |------------| | 外链 Js | |------------| | 内容 | |____________|

Hinweis der Redaktion

  1. 页面渲染过程