浅析浏览器解析和渲染 偏右.

Slides:



Advertisements
Similar presentations
第 15 章 Mobile PHP 與 Ajax 15-1 Mobile PHP 15-2 Ajax 的基礎 15-2 Ajax 的基礎 15-3 jQuery 的 Ajax 方法 15-3 jQuery 的 Ajax 方法 15-4 應用實例:關鍵字建議清單 15-4 應用實例:關鍵字建議清單.
Advertisements

Web Maple— 云端计 算 数学学院刘海洋 胡婷婷. 需求 什么是 Web Maple ? Maple : “ 数学家的软件 ” 符号和数值计算 动态编程语言 集成编辑环境与图形输出 Web Maple :网页上的数学家 完整的 Maple 功能 云端计算 网页独特的输入输出格式.
HyperText Markup Language
具有梦天堂特色的 Web前端开发规范 叫我三桂吧 t.qq.com/aNd1coder.
JQuery 基础教程.
JQuery Mobile 網頁切換 靜宜大學 資管系 楊子青.
第8章 CSS基础知识 【学习目标】 对于一个网页设计者来说,对HTML语言一定不感到陌生,因为它是网页制作的基础,但是如果希望网页能够美观、大方,并且升级维护方便,那么仅仅知道HTML还是不够的,还需要了解CSS。了解CSS基础知识,可以为后面的学习打下基础。 本章主要内容包括: 为什么在网页中加入CSS。
2 HTML5與CSS3 2-1 HTML5的頁面結構 2-2 HTML5的文字編排標籤 2-3 HTML5的圖片與超連結標籤
XML 第05讲 使用CSS显示XML.
第五单元课1-3 层叠样式表.
Css2/css3全教程 选择器 群号: 韬略课堂:何韬.
浏览器工作原理浅析 TID Ghostzhang.
计算机图形技术 余 莉
CSS – 進階 IDIC.
社團社群網站設計競賽 說明會 南台科技大學計網中心.
RWD網頁設計實務 李欣螢 以誠研發有限公司.
网页编程基础 曾宪文,Rex Zeng 纸飞机网络技术部部长 Leader of ACE.
CT212 (02/03)-Network Programming and design
第四章 样式表CSS CSS技术是一种格式化网页的标准方式,它通过设置CSS属性债周页元素获得各种不同效果。本章共分9个实例,主要内容包括的基础知识、CSS创建与导入、CSS的语法结构、常用CSS的分类、CSS的使用原则等内容。
第8章 样式表.
ASP动态网页设计实用教程 主讲教师: 开课单位:.
CSS简介 WEB前端三剑客之二.
CSS 徐于晉 陳政樺 陳郁蘋 黃麒錕 劉芳賓.
标准规范 2.自己偏好习惯 3.讨论/建议 永远遵循同一套编码规范 -- 不管多少人同时参与编码,所有代码都应该看上去像是一个人编写的一样。
第 11 章 讓版面更活潑 的 CSS.
Ajax编程技术 第一章 Ajax简介.
第 13 章 用CSS 設定 文字顏色與背景.
邁向 HTML5 如何與 ASP.NET 整合 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 )
Ch.13 HTML網頁實作.
CSS排版:盒子模式 靜宜大學 資管系 楊子青.
XSL: Extensible Stylesheet Language
Happy Designer 第四次聚會 課程內容分享 2008/11/20.
Web前端开发技术与实践 第3章:初识HTML5 阮晓龙 /
JavaScript 靜宜大學 資管系 楊子青.
Web前端开发技术与实践 第10章:盒子模型 阮晓龙 /
Web前端开发技术与实践 第11章:背景与边框 阮晓龙 /
十二年國民基本教育中等學校教師教學專業能力研習五堂課
JQuery與動畫及特效 靜宜大學 資管系 楊子青 網路參考資源:
HTML & CSS.
JQuery Mobile基礎 (開發跨平台行動裝置網頁)
基礎程式設計範例 -網頁名片.
主讲:陶建平 华中科技大学网络与计算中心
CSS技术 蒋玉华.
WEB统一检索本地整合技术 中国农业大学图书馆 康实.
UI 软件 设计 页面布局(二).
大家所认为的电子商务行业有哪些途径来赚钱?
聖文德書院 ST BONAVENTURE COLLEGE & HIGH SCHOOL
2.2 Web界面设计 信息工程系 向模军 Tel: QQ:
第4章 CSS基础 主讲人:刘泰然 经济管理学院.
网页设计与制作教程第5版 机械工业出版社同名教材 配套电子教案.
第13章 CSS 通过CSS可以使用更丰富、更灵活的样式,更简单地 设计出更美观的网页。同时,也让网页的设计与维护 更有效率。CSS在网页设计中的作用尤为重要,是网 页设计师必备的知识。本章首先介绍什么是CSS、CSS 的基本语法等基础知识,接着学习利用“CSS”面板 管理规则,如何在Dreamweaver中创建与应用CSS样式.
JQuery基礎與動畫、特效 靜宜大學 資管系 楊子青.
JQuery基礎與動畫、特效 靜宜大學 資管系 楊子青 網路參考資源:
武汉纺织大学传媒学院 cm.wtu.edu.cn
主讲:陶建平 华中科技大学网络与计算中心
UI 软件 设计 页面布局(一).
《网页设计与制作》.
HTML大探索.
CSS排版:盒子模式 靜宜大學 資管系 楊子青.
武汉纺织大学传媒学院 cm.wtu.edu.cn
JQuery Mobile基礎 (開發跨平台行動裝置網頁)
CSS基礎 靜宜大學 資管系 楊子青.
React.js.
Migrate to HTML5.
CSS 一起來美化網頁吧!!.
Web前端开发 第7章:初识CSS3 阮晓龙 / 河南中医药大学管理科学与工程学科
使用Dreamweaver 8 國立竹東高級中學 資訊科技概論 黃秋雅老師
【學雜費減免】 學務系統 線上申請步驟 學校網頁和系統 皆需以IE瀏覽器開啟 (不適用Google Chrome 或其他瀏覽器)
知识点讲解 1、DOM节点树 DOM(Document Object Model)称为文档对象模型,是一个表示和处理文 档的应用程序接口(API),可用于动态访问、更新文档的内容、结构和样 式。DOM将网页中文档的对象关系规划为节点层级,构成它们之间的等级关 系,这种各对象间的层次结构被称为节点树。如下图所示。
Presentation transcript:

浅析浏览器解析和渲染 偏右

Loading Parsing Rendering Layout Painting

<link rel="dns-prefetch" href="//hostname.com"> 当Chrome访问google页面的搜索结果时,它会取出链接中的域名进行预解析。 <link rel="dns-prefetch" href="//hostname.com">

<link rel="prefetch" href="http://"> 预下载 <link rel="prefetch" href="http://"> 利用空闲时间段的流量来预加载,提升用户访问后续页面的速度(淘宝购物车页或订单页预加载收银台的资源?)

利用JS实现 preload = ['http://tools.w3clubs.com/pagr2/sleep.expires.png', 'http://tools.w3clubs.com/pagr2/sleep.expires.js', 'http://tools.w3clubs.com/pagr2/sleep.expires.css'], for (i = 0, max = preload.length; i < max; i += 1) { if (isIE) { new Image().src = preload[i]; continue; } o = document.createElement('object'); o.data = preload[i]; 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连接数 浏览器 HTTP 1.1 HTTP 1.0 IE 6,7 2 4 IE 8 6 Firefox 6 Safari 7 Chrome 15 ? Opera 12 在《Even Faster Web Sites》一书中推荐了对静态文件服务使用HTTP/1.0协议来提高IE 6/7浏览器的速度。

Loading Parsing Rendering Layout Painting

Parsing 将HTML文档转化为DOM树并下载相关资源的过程。 html head title Body div “标题” h1 “文本” p

各浏览器加载策略

Demo <!DOCTYPE html> <html> <head> <title>测试各浏览器加载的页面</title> <link rel="stylesheet" href="style1.css" type="text/css" /> <link rel="stylesheet" href="style2.css" type="text/css" /> <link rel="stylesheet" href="style3.css" type="text/css" /> </head> <body> <p>测试文字</p> <img src=“1.jpg” alt=“图1"> <img src=“2.jpg” alt=“图2"> <img src=“3.jpg” alt=“图3"> <script src="test1.js"></script> <script src="test2.js"></script> <script src="test3.js"></script> </body> </html>

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执行策略 <!DOCTYPE html> <html> <head> <title>测试各浏览器加载的页面</title> <link rel="stylesheet" href="style1.css" type="text/css" /> <link rel="stylesheet" href="style2.css" type="text/css" /> <link rel="stylesheet" href="style3.css" type="text/css" /> </head> <body> <p>测试文字</p> <script src=“block.js"></script> <img src=“1.jpg” alt=“图1"> <img src=“2.jpg” alt=“图2"> <img src=“3.jpg” alt=“图3"> <script src="test1.js"></script> <script src="test2.js"></script> <script src="test3.js"></script> </body> </html>

IE 6

Firefox 预取JS。 JS执行过程延迟到所有JS(inline & external)下载完成后依次执行。

IE9 分段解析。 每获得一定字节量的html后,先读取其中所有外部资源并加载,再同步解析这段文档。

注意script的位置,避免阻塞css和img的下载 小结 http://www.browserscope.org/ 注意script的位置,避免阻塞css和img的下载

Inline Script 阻塞渲染 阻塞css文件

阻塞渲染 <p>我被阻塞了</p> <script> var n = Number(new Date()); var n2 = Number(new Date()); while((n2 - n) < 5000){ n2 = Number(new Date()); } </script> <img src="1.jpg" alt="1.jpg">

阻塞渲染 将不紧急的JS延迟, 使页面尽可能早渲染。 http://stevesouders.com/cuzillion/?ex=1&title=Inline+Scripts+Block+Rendering 将不紧急的JS延迟, 使页面尽可能早渲染。

解决JS阻塞 Put Scripts at the bottom(交互型页面的问题) defer & async(浏览器兼容?) Script inject*(提前载入js,延迟执行)

阻塞css文件 Suppose an inline script block was placed between the stylesheet's LINK tag and the image IMG tag. The result, for some browsers, is that the image isn't downloaded until the stylesheet finishes. The inline script block doesn't 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;}

Put Stylesheets at the Top. CSS Block? 不阻塞解析 阻塞渲染 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变成一次。

当你请求上面的一些属性的时候,浏览器为了给你最精确的值,需要flush队列, 破坏优化 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”; .className1 {color:#eee;border:1px solid red;font-size:20px;background:blue;width:200px’;} //... testNode.className = ‘className1’; testNode.style.cssText = ‘color:#eee;border:1px solid red;font-size:20px;background:blue;width:200px’;

简单的测试 用事实证明cssText性能高 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性能高 http://www.cnblogs.com/snandy/archive/2011/03/13/1982954.html 用事实证明cssText性能不一定高 http://www.cnblogs.com/easyc/archive/2011/03/14/1983772.html http://jsperf.com/csstext-vs-multiple-style/5

缓存Layout属性值 // 别这样写 for(循环) { el.style.top = el.offsetTop + 5 + "px"; } // 这样写好点 var top = el.offsetTop, s = el.style; for(循环) { top += 10; s.top = top + "px"; }

权衡动画帧宽 jQuery 13ms Arale 20ms YUI 20ms Google clousure 20ms Mootools 16.6ms http://forum.jquery.com/topic/increasing-animation-frame-interval-and-exposing-it

总结 使用GET请求 利用JS预加载资源 Script inject改善阻塞 注意inline JS的位置,防止css阻塞其他资源 避免使用通配符 避免在后代选择符的最后使用tag名 去掉冗余的选择符 用class代替后代选择符 离线操作DOM 集中修改样式 缓存Layout属性值 权衡动画帧宽

其他 Cache iframe

参考 JS阻塞页面加载: http://hi.baidu.com/dong_love_yan/blog/item/1a70ec3c7d628e2e70cf6c8c.html 解放你的浏览器 http://fed.renren.com/2010/01/247 浏览器内核的解析和对比 http://www.iefans.net/liulanqi-neihe-jiexi/ 浏览器渲染与web前端开发 http://www.slideshare.net/nwind/web-5575667 页面重构应注意的repaint和reflow http://www.scriptlover.com/static/821-html-repaint-reflow 页面无阻塞加载研究 http://www.ueder.net/2011/01/06/页面无阻塞加载研究/ Browser Performance Wishlist http://www.stevesouders.com/blog/2010/02/15/browser-performance-wishlist Optimize browser rendering http://code.google.com/intl/zh-CN/speed/page-speed/docs/rendering.html#UseEfficientCSSSelectors http://www.browserscope.org/ http://stevesouders.com/cuzillion/ https://developer.mozilla.org/En/HTML/Element/Script

Thanks