最近,在研究React的虚拟DOM如此之快的缘由时,我意识到咱们对javascript性能的了解甚少。因此我写这篇文章是为了帮助提升对Repaint和Reflow以及JavaScript性能的认识。
一图赛过千言万语,因此让咱们来了解下浏览器的工做原理javascript
en...那么什么是浏览器引擎,什么是渲染引擎呢?html
浏览器引擎的主要工做是将Html文档以及网页上的其余资源转换成交互可视化的视图,并呈如今用户设备上。除了浏览器引擎,关于相关概念的其余两个经常使用术语:“layout engine”和“rendering engine”。理论上,布局(layout)和渲染(rendering)(或“painting”)能够由单独的引擎处理。然而,在实践中,它们是紧密耦合的,不多单独考虑。java
当咱们点击页面上的某个连接或在浏览器的URL地址栏按下Enter键时,向该页面发出HTTP请求,而且相应的服务器提供(一般)HTML文档做为响应。(二者之间发生了不少事情)。node
一旦构建了渲染树,浏览器就可以在屏幕上绘制渲染树节点。浏览器
<html> <head> <title>Repaint And Reflow</title> </head> <body> <p> <strong>How's The Josh?</strong> <strong><b> High Sir...</b></strong> </p> <div style="display: none"> Nothing to display </div> <div><img src="..." /></div> ... </body> </html>
表示此HTML文档的DOM树基本上每一个标记都有一个节点,节点之间的每一个文本都有一个文本节点(为简单起见,咱们忽略了空白也是文本节点的事实):服务器
documentElement (html) head title body p strong [text node] p strong b [text node] div [text node] div img ...
渲染树能够是DOM树中可见的部分,它缺乏一些东西 - head和隐藏的div,但它有文本行的附加节点(又名帧,也称为盒子)。布局
root (RenderView) body p line 1 line 2 line 3 ... div img ...
渲染树中的根节点包含全部其余的元素称为帧(盒子),咱们能够将其视为浏览器窗口的内部部分,由于这是页面能够传播的受限区域。从技术上讲,WebKit内核调用根节点RenderView,它对应于CSS初始包含块,它基本上是从页面顶部(0,0)到(window.innerWidth,window.innerHeight)的视口矩形。性能
伴随着绘制,老是有一个初始化页面。以后,改变用于渲染树的输入信息可能由其中一个或两个所致使(Repaint或Reflow):编码
Repaint和Reflow可能很昂贵,它们可能会损害用户体验,并使UI显得缓慢spa
顾名思义,重绘(Repaint)只不过是屏幕上的从新绘制元素,由于元素的变化会影响元素的可见性,但不会影响布局
如:
均可能触发重绘(Repaint)
重排(Reflow)意味着在文档中从新去计算元素的位置和几何形状。目的是为了从新渲染文档的部分或所有。因为重排在浏览器中是用户行为阻塞的操做,因此对于开发人员怎样去提升重排的时间以及了解各类文档属性(DOM深度,CSS规则效率,不一样类型的样式更改)对中排时间的影响是很重要的。
有时,重排文档中的单个元素可能须要重排其父元素以及其后的任何元素。