当咱们请求页面的时候,拿到资源时,浏览器是怎么渲染的呢?这里咱们就来了解一些浏览器渲染的过程。javascript
认识完关键词以后,咱们来看一下浏览器是怎么将html、css、js文件,渲染到页面上的。css
首先固然是请求html文件,拿到html文件以后,浏览器就能够对文件进行解析处理。html
拿到html文件以后,HTML解释器会先对拿到的数据进行响应的编码,转成本身想到的格式。前端
而后就开始构建DOM树,为何是树结构呢?前端的同窗应该都很好理解,由于html结构自己就是一个树形结构,因此树是html很好的表现形式。java
咱们来看html的hello world,从锁进格式就能够看出html的DOM树。node
<html lang="en">
<head>
<title>title</title>
</head>
<body>
<div>hello world</div>
</body>
</html>
复制代码
接着,咱们来看css,CSSOM是由css规则树来处理的。chrome
拿到css数据以后,CSS解释器就开始构建CSSOM。浏览器
由于css的规则是须要给html节点配置的,因此也是一棵树的形状。服务器
html {
color: #ffffff;
}
body {
font-size: 14px;
}
复制代码
有来DOM树和CSSOM以后,其实还不是最后须要渲染的东西,由于有些标签实际上是不须要显示的,好比head
内容,好比display:none;
的内容。布局
因此,这里渲染引擎会将DOM树和CSSOM合成一棵渲染树。
咱们能够看到下面这张图片,这就是渲染树的组合流程。
有了渲染树以后,浏览器要怎么把渲染树画到浏览器上呢?
渲染树实际上是一个树结构,尚未进行实例的结构布局,因此,布局这里就根据渲染树的结构样式,对盒子宽高进行计算,总体结构布局。
布局完成以后,浏览器就要把布局结构绘制到浏览器上。
js文件呢?几乎全部的页面都会有js脚本,否则没有办法与用户/服务器进行交互,下面咱们来看看js脚本。
js引擎,看到这个名字,咱们就能够理解,用来执行js脚本用的。目前chrome用的是javascript v8引擎,node使用的也是javascript v8引擎。
为何这里要讲到js引擎呢?由于js脚本有可能会阻塞浏览器的渲染。
相信前端同窗写页面的时候都有一个习惯,就是把js放到html文件的最下面。
为何呢?为来不阻塞浏览器渲染。
<!--阻塞-->
<html lang="en">
<head>
<title>Document</title>
<script src="./binnie.js"></script>
</head>
<body>
<div>hello world</div>
</body>
</html>
<!--非阻塞-->
<html lang="en">
<head>
<title>Document</title>
// defer脚本会在页面渲染完成才执行js脚本
<script src="./binnie.js" defer></script>
</head>
<body>
<div>hello world</div>
<script src="./binnie.js"></script>
</body>
</html>
复制代码
咱们知道,js脚本能够操做DOM结构,也能够操做CSS,因此执行js脚本时,浏览器会中止DOM和CSSOM的构建。
构建DOM树过程当中,若是遇到 script
标签,那么DOM构建过程会中止而且等待js脚本执行完毕。
当js脚本操做css时,因为须要操做CSSOM,因此这里会等到CSSOM完成构建完成以后,才继续执行js脚本。
页面第一次渲染的时候,会绘制初始化的页面,当页面结构发生改变时,浏览器也会从新对页面进行绘制&渲染,也就是重绘&重排。
重绘不必定会重排,可是重排必定会触发重绘。
了解浏览器的渲染机制,咱们在项目优化过程当中,能够针对其机制,进行项目优化,加快页面渲染过程~