浏览器渲染HTML页面流程

2019-10-15  本文已影响0人  Kevin丶CK

背景

JavaScript是一种动态类型语言,在编译时并不能准确知道变量的类型,只可以在运行时确定。所以最近在研究V8引擎中JavaScript的编译和执行过程。
在V8中,JavaScript相关代码并非一下完成编译的,而是在某些代码需要执行时,才会进行编译,这就提高了响应时间,减少了时间开销。既然考虑到提高效率,感觉有必要再把页面渲染流程回顾一下。

渲染过程

阻塞渲染

由于我们的页面包含JS脚本和CSS,浏览器在渲染页面时,遇到linkscript,HTML Paser会被阻塞。
默认情况下,CSS 被视为阻塞渲染的资源,这意味着浏览器将不会渲染任何已处理的内容,直至 CSSOM 构建完毕。JavaScript 不仅可以读取和修改 DOM 属性,还可以读取和修改 CSSOM 属性。所以得关注一下几点:

因此,实际开发过程中,约定的规则:

备注
解析器一旦读取到script标签(内联或外联)时,会阻塞DOM构建,它会去请求脚本并执行完成后才继续执行下去。asyncdefer标签除外,asyncdefer属性会让脚本异步执行,不会阻塞浏览器解析。

repaints and reflows

CSSJavaScript往往会修改DOM或者CSSOM,这就会引起浏览器的重排/重绘过程。
重排就是渲染树的一部分必须要更新 并且节点的尺寸发生了变化。这就会触发重排操作。
重绘部分节点需要更新,但是没有改变他的集合形状,比如改变了背景颜色,这就会触发重绘。
记住,重排一定会引起重绘,而重绘不一定会引起重排。

一、 reflow(重排 / 回流):根据Render tree进行节点信息计算(Layout)。
当Render Tree刚构建完时,并不包含元素节点的位置和大小信息。计算这些值的过程称为重排或回流。

常见的引起重排的操作:

优化性能

重排一定会引起重绘,而重绘不一定会引起重排,所以要想提升性能,要从减少重排开始入手。

上一篇下一篇

猜你喜欢

热点阅读