update: 浏览器的渲染过程

This commit is contained in:
qianguyihao 2021-01-18 20:46:03 +08:00
parent b80ee60568
commit 0c3df74022
6 changed files with 60 additions and 37 deletions

View File

@ -86,32 +86,68 @@ PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用
面试时可以这样回答 HTML 4.01 中有两种写法一种是严格的一种是传统的并且答出二者的区别 HTML 5的写法是`<!DOCTYPE html>`
## 浏览器的渲染过程
浏览器的渲染过程非常复杂但是面试只用说几句话就行了不然太耗时间如何快速简洁地描述清楚是关键
### 渲染树
![](http://img.smyhvae.com/20210118-2005.png)
> 上方图片的来源[Google 官方 | 渲染树构建布局及绘制](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=zh-cn)
**渲染树**包含了网页中有哪些节点各个节点的CSS样式大小颜色等以及他们的从属关系
我们写完前端代码之后计算机通过解释器把代码文本翻译成机器能理解的数据结构比如说html标签是由一对一对的尖括号表述的可以被浏览器解析为有含义的标记这些标记被翻译成节点对象存放到链型数据结构中这些节点被称之为**DOM对象**这个链型数据结构就是**渲染树**
### 渲染过程重要
浏览器的渲染过程非常复杂但是面试只用说几句话就行了不然太耗时间如何快速简洁地描述清楚是关键来看看下面这张图
![](http://img.smyhvae.com/20180310_1257.png)
这里先解释一下几个概念方便大家理解
这里解释一下几个概念方便大家理解
- DOM Tree浏览器将HTML解析成树形的数据结构DOM
- DOMDOM Tree浏览器将HTML标签解析成树形的数据结构DOM树包含了有哪些节点以及节点之间的嵌套关系
- CSS Rule Tree浏览器将CSS解析成树形的数据结构
- CSSOMCSS Rule Tree浏览器将CSS解析成树形的数据结构CSSOM包含了节点的样式
- Render Tree: DOM和CSSOM合并后生成Render Tree虽然有了Render Tree但并不知道节点的位置需要依靠接下来的layout
- 渲染树Render Tree: DOM 树与 CSSOM 树合并后形成渲染树渲染树只包含渲染网页所需的节点但并不知道位置
- layout: 有了Render Tree浏览器已经能知道网页中有哪些节点各个节点的CSS定义以及他们的从属关系从而去**计算出每个节点在屏幕中的位置**(宽高颜色等)
- 布局Layout: **通过布局计算出每个节点在屏幕中的位置**(大小颜色等)
- painting按照算出来的规则通过显卡把内容画到屏幕上
- 绘制Painting按照算出来的规则通过显卡把内容画出来
- display打击看到的最终效果
- conmposite合成浏览器在绘制的时候不会把所有的内容都画在同一个层上需要最终把这些层合成到一起显示在屏幕上
参考链接
- [浏览器渲染原理及流程[]](http://www.cnblogs.com/slly/p/6640761.html)
- [浏览器渲染原理及流程](http://www.cnblogs.com/slly/p/6640761.html)
### 关键渲染路径
浏览器渲染分为五个阶段
> JavaScript/CSS --> Style --> Layout --> Paint --> Composite
![](http://img.smyhvae.com/20210118-1950.jpg)
> 上方图片的来源<https://developers.google.com/web/fundamentals/performance/rendering>
关键渲染路径描述的是渲染从触发到绘制的全过程一共经历了五个阶段
1通过JSCSS代码来**触发**页面上的视觉变化
2Style浏览器要重新对样式进行计算
3layout同上一段
4painting同上一段
5conmposite同上一段
理论上上面的五个步骤都是必须要经历的但是有些样式并不会影响布局也不会影响绘制所以浏览器对这方面的性能进行了优化并不一定要经历布局和绘制这两个过程这就需要我们先了解一下重排重绘这两个概念详见下一段
## Reflow重排
@ -141,11 +177,10 @@ PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用
### 定义
**Repaint重绘制**当各种盒子的位置大小以及其他属性例如颜色字体大小等都确定下来后浏览器便把这些元素都按照各自的特性绘制一遍于是页面的内容出现了这个过程称之为 Repaint
**Repaint重绘制**当各种盒子的位置大小以及其他属性例如颜色字体大小等都确定下来后浏览器便把这些元素都按照各自的特性绘制一遍于是页面的内容出现了这个过程称之为 Repaint
说白了页面要呈现的内容统统画在屏幕上这就叫 Repaint
### 什么时候触发 Repaint
- DOM改动
@ -169,28 +204,3 @@ PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用
参考链接[如何减少浏览器repaint和reflow ?](http://blog.csdn.net/liaozhongping/article/details/47057889)

View File

@ -529,7 +529,7 @@ Chrome DevTools能够检测各种性能参数其实也是调用了一些性
- SSL 安全连接耗时: connectEnd - secureConnectionStart
- 网络请求耗时 (TTFB): responseStart - requestStart
- 网络请求耗时 (TTFB): responseStart - requestStart
- 数据传输耗时: responseEnd - responseStart

View File

@ -0,0 +1,13 @@
## 浏览器的渲染机制
我们需要先理解浏览器的渲染经历了哪些过程才能有针对性的进行相关优化
掌握浏览器的渲染优化可以说是前端工程师的一个分水岭如果想要具备架构师的思维需要达到什么样的能力不光是要解决当下的问题还需要掌握基本的原理将来在遇到新问题时也能解决预测问题
有一个经典的面试题是在浏览器的地址栏输入url回车后经历了哪些过程这个问题并不简单根据你回答的详细程度可以看出你对前端知识的掌握程度你能否答出浏览器的渲染机制如果不能说明你对浏览器渲染的性能优化不够了解
关于浏览器的渲染机制可以看本教程的另外一篇文章
> 前端面试/面试必看/浏览器渲染机制.md