Web/13-前端面试/01-面试必看/09-浏览器渲染机制.md
2021-01-18 20:46:03 +08:00

207 lines
7.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 前言
> 接下来的几篇文章讲一下二面的内容
**二面的内容**
- 渲染机制
- JS 运行机制
- 页面性能
- 错误监控
本文接下来讲渲染机制
**渲染机制**包括的内容
- 什么是DOCTYPE及作用
- 浏览器渲染过程
面试经常会问在浏览器中输入url发生了哪些事情其中有一部就是浏览器的渲染过程
- Reflow重排
面试官问完了渲染机制一般会紧接着问重排Reflow你可千万别说你没听过
- Repaint重绘
- Layout布局
这里的Layout指的是浏览器的Layout
## 什么是DOCTYPE及作用
### 定义
**DTD**Document Type Definition文档类型定义
是一系列的语法规则用来定义XML或者(X)HTML文件类型**浏览器会使用DTD来判断文本类型**决定使用何种协议来解析以及切换浏览器模式说白了就是DTD就是告诉浏览器我是什么文档类型你要用什么协议来解析我
**DOCTYPE**用来声明DTD规范
一个主要的用途便是文件的合法性验证如果文件代码不合法那么浏览器解析时便会出现一些差错说白了DOCTYPE就是用来声明DTD的
### 常见的DOCTYPE声明有几种
> 面试官紧接着会问常见的 DOCTYPE 有哪些以及 HTML5 DOCTYPE 怎么写
1**HTML 4.01 Strict**严格的
```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
```
PS该DTD包含所有的HTML元素和属性但不包括展示性的和弃用的元素比如 fontu下划线等这些是被废弃了的
2**HTML 4.01 Transitional**传统的
```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
```
PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用的元素比如 fontu下划线等
3HTML 5
```html
<!DOCTYPE html>
```
**总结**
面试时不会让你写出 HTML 4.01的写法因为大家都记不住但是要记住 HTML 5 的写法别看它简单知道的人还真不多
面试时可以这样回答 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树DOM Tree浏览器将HTML标签解析成树形的数据结构DOM树包含了有哪些节点以及节点之间的嵌套关系
- CSSOMCSS Rule Tree浏览器将CSS解析成树形的数据结构CSSOM包含了节点的样式
- 渲染树Render Tree: DOM 树与 CSSOM 树合并后形成渲染树渲染树只包含渲染网页所需的节点但并不知道位置
- 布局Layout: **通过布局计算出每个节点在屏幕中的位置**(大小颜色等)
- 绘制Painting按照算出来的规则通过显卡把内容画出来
- conmposite合成浏览器在绘制的时候不会把所有的内容都画在同一个层上需要最终把这些层合成到一起显示在屏幕上
参考链接
- [浏览器渲染原理及流程](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重排
### 定义
**重排 Reflow**DOM结果中的各个元素都有自己的盒子模型这些都需要浏览器**根据各种样式来计算并根据计算结果将元素放在它该出现的位置**这个过程称之为Reflow
### 什么时候触发 Reflow
- 增加删除修改DOM节点时会导致 Reflow Repaint
- 移动DOM的位置或是加个动画的时候
- 修改CSS样式时宽高display 为none等都是通过css样式来修改的
- 当用户Resize窗口时移动端没有这个问题或是滚动的时候**有可能**会触发具体要看浏览器的规则
- 修改网页的默认字体时这个影响非常严重
**面试总结**
首先要答出 Reflow 定义其次什么时候触发至少要答出两条更进一步面试官可能还会问你**怎么避免reflow**这个自己去查查吧
## Repaint重绘
### 定义
**Repaint重绘制**当各种盒子的位置大小以及其他属性例如颜色字体大小等都确定下来后浏览器便把这些元素都按照各自的特性绘制一遍于是页面的内容出现了这个过程称之为 Repaint
说白了页面要呈现的内容统统画在屏幕上这就叫 Repaint
### 什么时候触发 Repaint
- DOM改动
- CSS改动
其实就是判断当前呈现的内容是否发生变化无论这个变化是通过DOM改动还是CSS改动只要页面显示的内容不一样了肯定要 Repaint
**面试总结**
面试官经常会问如何**尽量减少**Repaint的频率
注意 reflow是问怎么避免repaint是问怎么减少Repaint是无法避免的否则就成了静态页面了
**答案**
1如果需要创建多个DOM节点可以使用**DocumentFragment**创建完然后一次性地加入document加一个节点就repaint一次不太好
2将元素的display设置为none完成修改后再把display修改为原来的值
参考链接[如何减少浏览器repaint和reflow ?](http://blog.csdn.net/liaozhongping/article/details/47057889)