浏览器渲染整体来讲分为如下几步javascript
请求页面
DOM树
CSSOM树
渲染树(RENDER TREE)
布局(layout)
绘制(painting)
到界面上网络部分放到TCP协议中,在这就很少说了css
DOM树和CSSOM树的构建流程很是像,就以DOM树为例html
浏览器从服务器获取的是16进制文件流,好比3C 62 6F 64 79 3E 48 65.....
,浏览器要把16进制的Bytes转化成字符串,再遍历这个字符串解析成tokensvue
浏览器是怎么将字符串解析成tokens的。使用的方法是状态机
。java
状态机怎么执行的react
- 接受到<字符。多是一个标签的开头,开启一个状态
- 下一个字符是字母,就是标签名
- 下一个字符是!,就是注释
- ....
- 接受到非<字符。多是一个文本节点,开启一个状态
- ....
浏览器一步步将文件流转化为字符串再经过状态机转化为token,获得token后,按照W3C规则转换成DOM树。css3
简单总结下:后端
须要注意的事:浏览器
浏览器根据DOM树和CSSOM树生成带有标签和样式信息的渲染树(Render Tree)。渲染树与DOM树不是一一对应的关系,不显示的节点不会出如今渲染树上。缓存
根据渲染树提供的节点和样式,计算元素在视口中的确切的大小和位置。
将元素计算后的大小和位置渲染到页面上的过程。渲染树的绘制工做是浏览器调用UI后端组件完成的。
一些操做会引起元素位置或者大小的变化,这样浏览器须要从新进行Lauout计算(回流/重排),重排完成后,浏览器须要从新绘制(重绘)。
若是是改变一些基础样式好比颜色,则不须要重排,只须要重绘便可。
重绘不必定会回流,可是回流必定会触发重绘
浏览器自上而下读取代码,读取到资源文件
使用css有三种方式:使用link、@import、内联样式,其中link和@import都是导入外部样式。它们之间的区别:
另外外部样式若是长时间没有加载完毕,浏览器为了用户体验,会使用浏览器会默认样式,确保首次渲染的速度。因此css通常写在headr中,让浏览器尽快发送请求去获取css样式。
JavaScript执行线程与GUI渲染线程不能同时执行,这就意味着执行js代码势必会阻塞页面渲染。为了避免阻塞页面的渲染,能够:
关于<script>
、<script defer>
、<script async>
的区别(配合图片食用更佳)
<script>
:当即中止页面渲染去加载资源文件,当资源加载完毕后当即执行js代码,js代码执行完毕后继续渲染页面<script defer>
:开辟新的线程去加载资源文件,当资源加载完毕后等待页面渲染,页面渲染完毕后再执行js代码<script async>
:开辟新的线程去加载资源文件,当资源加载完毕后当即执行js代码,js代码执行完毕后继续渲染页面(特别注意:多个async js执行顺序是按照加载完毕的顺序,非js请求顺序)\ | 阻塞页面渲染(GUI线程) | 当即加载js资源 | js加载完毕后当即执行 | 按照script标签顺序执行脚本 |
---|---|---|---|---|
script | 是 | 是 | 是 | 是 |
defer | 否 | 是 | 否 | 是 |
async | 否 | 是 | 是 | 否 |
onload:是页面资源加载完毕,包括图片、视频资源
DOMContentLoaded:DOM渲染完成
了解这么多,最终仍是要为了性能优化服务。除了已经提过的减小回流的优化外,还有: