关键渲染路径
关键渲染路径(Critial Rendering Path)
- 从服务器获取HTML文件后到页面呈现完整内容发生的事情
分为六步
- 创建DOM树(Constructing the DOM Tree)
- 创建CSSOM树(Constructing the CSSOM Tree)
- 执行脚本(Running JavaScript)
- 生成渲染树(Creating the Render Tree)
- 生成布局(Generating the Layout)
- 绘制(Painting)
创建DOM树
将HTML中的所有标签生成一棵树
- HTML中的每个元素或文本对应一个节点
- 嵌套在元素内的元素会被解析成外层元素的子节点
注意:
- HTML可以部分执行
- 即不需要等到全部解析完毕才显示页面
- 其他资源可能阻塞页面渲染
- CSS、JavaScript
1 | <html> |
上述代码解析为DOM树为:
创建CSSOM树
CSSOM(CSS对象模型)树
- 附在DOM结构上的样式的一种表示方式
- 与DOM树类似,只是每个节点带上样式,包括明确的定义和隐式的继承
注意:
- CSS是一种渲染阻塞资源(render blocking resource),即需要完全被解析后才能进入渲染树环节,不像HTML能部分执行
- 因为CSS具有继承属性,后面定义的样式会修改或覆盖前面的样式,所以不能部分执行,需要等到完全解析完毕后才能进入下一环节
- 当CSS文件适用于当前设备的时候,才会造成渲染阻塞
- 例如:<link rel=”stylesheet”>接受media属性,该属性规定了CSS文件适用于哪种设备
- 当设置为orientation: landscape(横向)的样式,则当我们竖着浏览页面的时候,这个CSS资源就不会起作用,也就不会阻塞
在上述HTML页面中,style.css代码如下
1 | body { font-size: 18px; } |
对应CSSOM树为
执行JavaScript
JavaScript是一种**解析阻塞资源(parser blocking resource)**,它能阻塞HTML页面的解析。
- 当页面解析到<script>标签,无论内联或外联,页面解析都会阻塞,转而执行JavaScript文件(如果是外联文件则需要先加载)。
- 这就是为什么如果JavaScript文件中有引用HTML中的元素,需要把JavaScript文件放到该元素后面
为了避免JavaScript文件阻塞页面的解析,可以加上async属性,使得JavaScript文件异步加载
1 <script async src="script.js">
生成渲染树
渲染树:DOM树和CSSOM树的结合
- 包含能最终渲染到页面的元素的树形结构
- 不包含那些用CSS样式隐藏的元素
- 例如display:none的元素
上述例子的渲染树如下
生成布局
布局决定了视口的大小,为CSS样式提供的依据
- 例如百分比的换算或者视口的总像素值
视口大小是由meta标签的name属性为viewport的内容设置所决定的,如果缺少这个标签,则默认的视口为980px
- 常见的viewport设置是自适应于设备尺寸
1 <meta name="viewport" content="width=device-width,initial-scale=1">例如用户访问一个设备宽度为1000px 的页面
- 一半的视口:500px
- 10%:10px
绘制
页面上的可见的内容会转化为屏幕上的像素点
- 绘制过程所花费的时间取决于DOM的大小以及元素的CSS样式
最后
可以利用Chrome开发者工具下的Timeline去观察整个关键路径渲染的过程
参考