资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2011/9/1,#,浅析浏览器解析和渲染,偏右,Loading,Parsing,Rendering,Layout,Painting,DNS,预解析,当,Chrome,访问,google,页面的搜索结果时,它会取出链接中的域名进行预,解析。,预下载,利用,空闲时间段的流量来预加载,,提升用户,访问后续页面的,速度(淘宝购物车页或订单页预加载收银台的资源?),利用,JS,实现,preload = (i = 0, max = preload.length; i max; i += 1) ,if (isIE) ,new Image().src = preloadi;,continue;,o = document.createElement(object);,o.data = preloadi;,o.width = 0;,o.height = 0;,document.body.appendChild(o);,使用,get,请求,大部分,浏览器(除了,Firefox,)在使用,post,时也会发送两个,TCP,的,packet,,所以性能上会有,损失,而,Get,只有一个。,http:/josephscott.org/archives/2009/08/xmlhttprequest-xhr-uses-multiple-packets-for-http-post,/,http,连接数,在,Even,Faster Web,Sites,一,书,中推荐,了对静态文件服务使用,HTTP/1.0,协议来提高,IE 6/7,浏览器的,速度,。,浏览器,HTTP 1.1,HTTP 1.0,IE 6,7,2,4,IE 8,6,6,Firefox,6,6,6,Safari,7,6,4,Chrome,15,6,?,Opera,12,6,4,Loading,Parsing,Rendering,Layout,Painting,Parsing,将,HTML,文档转化为,DOM,树并下载相关资源的过程。,html,head,title,“,标题,”,Body,div,h1,“,文本,”,p,“,文本,”,各浏览器加载策略,Demo,测试各浏览器加载的页面,测试文字,IE 6/7 & Opera,按文档顺序,解析,,,CSS,并行加载,外部,JS,串行加载,,阻塞,后续,资源,IE 8/9,JS,并行加载,Firefox & Chrome,分析文档结构,优先,并行,加载,css,和,js,同步模型,JS,引擎是基于事件驱动的单线程。,浏览器,一般有三,个常驻,线程:,JS,引擎线程、界面,渲染,线程、浏览器,事件触发,线程。,GUI,渲染,线程负责,渲染网页,,GUI,渲染线程与,JS,引擎是互斥的,当,JS,引擎执行,时,GUI,线程会被,挂起。,页面将停止一切解析和渲染的行为。,JS,阻塞,JavaScript,(,inline,& external,)的执行可能改变,DOM,结构,因此,Parser,和,Render,都会挂起等待,JS,执行结束。,执行在所有浏览器中默认都是阻塞,的。,external JS,的下载不应该阻塞页面。,IE6/7,、,Opera,JS,执行策略,测试各浏览器加载的页面,测试文字,IE 6,Firefox,预取,JS,。,JS,执行过程延迟到所有,JS,(,inline & external,)下载完成后依次执行。,IE9,分段解析。,每获得一定字节量的,html,后,先读取其中所有外部资源并加载,再同步解析这段文档。,小结,http:/www.browserscope.org,/,注意,script,的位置,避免阻塞,css,和,img,的下载,Inline Script,阻塞,渲染,阻塞,css,文件,阻塞渲染,我被阻塞了,var n = Number(new Date();,var n2 = Number(new Date();,while(n2 - n) 5000),n2 = Number(new Date();,阻塞渲染, Scripts at the,bottom(,交互型页面的问题,),defer,&,async,(浏览器兼容?),Script inject,*,(提前载入,js,,延迟执行),阻塞,css,文件,Suppose,an inline script block was placed between the stylesheets LINK tag and the image IMG tag. The result, for some browsers, is that the image isnt downloaded until the stylesheet finishes.,The,inline script block doesnt execute until after the stylesheet is downloaded and,parsed,(in case the inline script block depends on CSS rules in the stylesheet),.,阻塞,css,文件,CSS,本来是并行加载的(包括,IE6,)。,内嵌,JS,会打断并行。,尽量把,inline js,写在,css,前面。,阻塞,css,文件,IE 6/7/8,Opera,Loading,Parsing,Rendering,Layout,Painting,Render tree,根据,selector,计算节点的样式,Dom + Style =,Render,tree,只和呈现有关(,display:none,、,head,),等待,CSS,Render tree,html,head,title,“,标题,”,Body,div,h1,“,文本,”,p,“,文本,”,efficient CSS,selectors,Avoid,a universal key,selector,Make,your rules as specific as possible.,Prefer,class and ID selectors over tag selectors.,Remove,redundant qualifiers.,ID,selectors qualified by class and/or tag,selectors,Class,selectors qualified by tag selectors (when a class is only used for one tag, which is a good design practice anyway).,Use,class selectors instead of descendant,selectors,ul li color: blue,;,.,unordered-list-item color: blue,;,CSS,B,lock,?,不阻塞解析,阻塞渲染,Opera,的闪烁,行为?,Put Stylesheets at the Top.,Loading,Parsing,Rendering,Layout,Painting,Reflow & Repaint,当,DOM,元素的属性发生变化,(,如,color),时,而这些属性只是影响元素的,外观风格,浏览器,会通知,render,重描相应,的,元素,此,过程称为,Repaint,。,如果该次变化涉及元素布局,(,如,width),,浏览器,则抛弃原有,属性,重新,计算并把结果传递给,render,以重新描绘页面元素,此过程称为,Reflow,。,Reflow,必将引起,Repaint,,而,Repaint,不一定,会,引起,Reflow,。,什么操作会,引起,Reflow & Repaint,DOM,元素的添加、修改(内容)、,删除,隐藏元素,display:none(Reflow),visibility:hidden(,Repaint,),应用新的样式或者修改任何影响元素外观的属性,用户,的操作,,如,改变浏览器大小,改变浏览器的字体大小,等,浏览器的优化,很多浏览器,会,维护一个,队列,把所有会,引起,Reflow/Repaint,的,操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会把,flush,队列,进行一个批处理。这样就会让多次,的,Reflow,、,Repaint,变成,一,次。,破坏优化,offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTop/Left/Width/Height,clientTop/Left/Width/Height,width,height,请求,了,getComputedStyle(),或者,ie,的,currentStyle,当你请求上面的一些属性的时候,,浏览器为了给,你最精确的值,,需要,flush,队列,,,因为队列中可能会有,影响到这些值的操作。,如何做?,离线操作,DOM,集中修改样式,缓存,Layout,属性,值,权衡动画帧宽,离线操作,DOM,使用,documentFragment,或,div,等元素进行缓存,操作。,display:none,隐藏,元素,然后对该元素进行所有的操作,最后再显示该,元素,集中,修改,样式,testNode.style.color=#eee;,testNode.style.border=1px solid red;,testNode.style.fontSize=20px;,testNode.style.background=blue;,testNode.style.width=“200px,”;,testNode.style.cssText,= color:#eee;border:1px solid red;font-size:20px;background:blue;width:200px,;,.,className1 color:#eee;border:1px solid red;font-size:20px;background:blue;width:200px,;,/.,testNode.className = className1;,简单的测试,IE,6,IE 9,Firefox 6,Chrome 14,Opera 11,style,821ms,321ms,177ms,149ms,190ms,className,210ms,127ms,4ms,3ms,32ms,cssText*,501ms,398ms,156ms,182ms,34ms,用事实证明,cssText,性能,高, el.style.top = el.offsetTop + 5 + px;,/,这样,写好点,var top = el.offsetTop, s = el.style;for(,循环,) top += 10;s.top = top + px;,权衡动画帧,宽,j,Query 13ms,Arale 20ms,YUI 20ms,Google clousure 20ms,Mootools 16.6ms,http:/, inject,改善阻塞,注意,inline JS,的位置,防止,css,阻塞其他资源,将,css,文件放在顶部,避免使用通配符,避免在后代选择符的最后使用,tag,名,去掉冗余的选择符,用,class,代替,后代,选择符,离线操作,DOM,集中修改样式,缓存,Layout,属性值,权衡动画帧,宽,其他,Cache,iframe,参考,JS,阻塞页面加载,:,http,:/ Wishlist,http:/, browser,rendering,http:/,
展开阅读全文