【译】关键渲染路径

关于本文:
原文地址 翻译地址 译者:野草
本文发表于前端早读课【第875期】

有一个很经典的面试题:当你在浏览器输入一个网址并按下回车之后发生了什么?今天我们就来说说当浏览器从服务器获取了HTML文件之后经历了什么。事实上,从获取HTML文件直到浏览器以像素点的方式在屏幕中绘制出页面的内容确实经历了很多步骤,这些步骤我们称之为关键渲染路径(Critial Rendering Path)

理解关键渲染路径是提高页面性能的关键所在。总体来说,关键渲染路径分为六步。

  • 创建DOM树(Constructing the DOM Tree)
  • 创建CSSOM树(Constructing the CSSOM Tree)
  • 执行脚本(Running JavaScript)
  • 生成渲染树(Creating the Render Tree)
  • 生成布局(Generating the Layout)
  • 绘制(Painting)

【译】关键渲染路径_第1张图片

创建DOM树

DOM(文档对象模型)树是HTML页面完全解析后的一种表示方式。从根元素开始,页面上每个元素或者文本都会创建一个对应的节点。每个节点都包含了这个元素的所有属性,并且嵌套在元素内的元素会被解析成外层元素对应的节点的子节点。比如,元素标签对应的节点会有一个属性为href对应的子节点。

我们来看下面这个简单的HTML结构:

<html>  
<head>  
  <title>Understanding the Critical Rendering Pathtitle>
  <link rel="stylesheet" href="style.css">
head>  
<body>  
  <header>
      <h1>Understanding the Critical Rendering Pathh1>
  header>
  <main>
      <h2>Introductionh2>
      <p>Lorem ipsum dolor sit ametp>
  main>
  <footer>
      <small>Copyright 2017small>
  footer>
body>  
html>  

它将会被解析生成以下的DOM树。

【译】关键渲染路径_第2张图片

幸运的是,HTML可以部分执行并显示,也就是说,浏览器并不需要等待整个HTML全部解析完毕才开始显示页面。但是,其他的资源有可能阻塞页面的渲染,比如CSS,JavaScript等。

创建CSSOM树

CSSOM(CSS对象模型)树是对附在DOM结构上的样式的一种表示方式。它与DOM树的呈现方式相似,只是每个节点都带上样式 ,包括明确定义的和隐式继承的。

在上述的HTML页面中,style.css文件代码如下:

body { font-size: 18px; }

header { color: plum; }  
h1 { font-size: 28px; }

main { color: firebrick; }  
h2 { font-size: 20px; }

footer { display: none; }  

由此会生成以下的CSSOM树。
【译】关键渲染路径_第3张图片

CSS是一种渲染阻塞资源(render blocking resource),它需要完全被解析完毕之后才能进入生成渲染树的环节。CSS并不像HTML那样能执行部分并显示,因为CSS具有继承属性, 后面定义的样式会覆盖或者修改前面的样式。如果我们只使用样式表中部分解析好的样式,我们可能会得到错误的页面效果。所以,我们只能等待CSS完全解析之后,才能进入关键渲染路径的下一环节。

需要注意的是,只有CSS文件适用于当前设备的时候,才能造成渲染阻塞。标签接受media属性,该属性规定了此处的CSS文件适用于哪种设备。如果我们有个设备属性值为orientation: landscape(横向)的样式,当我们竖着浏览页面的时候,这个CSS资源是不会起作用的,也就不会阻塞渲染的过程了。

因为JavaScript脚本的执行必须等到CSSOM生成之后,所以说CSS也会阻塞脚本(script blocking)

执行JavaScript

JavaScript是一种解析阻塞资源(parser blocking resource),它能阻塞HTML页面的解析。

当页面解析到

你可能感兴趣的:(html,javascript,前端开发,性能优化,翻译系列)