In the years of IE 90% dominance there was nothing much to do but regard the browser as a “black box”, but now, with open source browsers having more than half of the usage share, it’s a good time to take a peek under the engine’s hood and see what’s inside a web browser. Well, what’s inside are millions of C++ lines…
作为一名Web开发者,了解浏览器内部原理可以帮助我们在编写网页时做出更好的决定,也可以帮助我们优化网页的性能。
浏览器的主要功能
浏览器的主要功能就是展现我们在网页上所选择的资源,这些资源常常就是HTML、PDF、图片、视频等。这些资源的地址就被定义为URI(统一资源定位符)。还有一个功能就是根据W3C的标准去解析请求下来的HTML、CSS文件。
浏览器内核
浏览器引擎也称为排版引擎、渲染引擎,当文件(HTML、XML、图片等)从互联网上下载下来的时候,就是浏览器引擎来解析的。
常见的浏览器内核有:
- Trident(三叉戟):IE、360安全浏览器、搜狗高速浏览器、百度浏览器、UC浏览器;
- Gecko(壁虎):火狐浏览器;
- Presto(急板乐曲)-> Blink(眨眼):Opera
- Webkit:Safari、360极速浏览器、搜狗高速浏览器、移动端浏览器(Android);
Webkit -> Blink:Google Chrome(从15),Microsoft Edge
渲染引擎的主要流程
浏览器渲染引擎是从资源请求下来开始的。
浏览器从网络上请求下来HTML文件,开始解析HTML文件,之后会根据HTML文档创建出来DOM树。
渲染引擎还会解析样式数据,包括HTML文件内和外部的样式表,之后再根据DOM和样式创建出渲染树,渲染树内包含了带有颜色、尺寸等视觉属性的矩形。
在渲染树经过布局操作之后,渲染树内每一个节点在屏幕内都具有具体的坐标。下一个环节就是绘制渲染树。 :::info 渲染引擎会尽可能快一点显示出来,所以它不会在构建和布局渲染树之前等待所有的HTML元素都被解析完成。一部分内容会先被解析,与此同时,另一部分的内容可能还在从网络中请求或解析过程中。 ::: 基本流程主要包括:
详细流程主要包括:解析CSS过程
在解析的过程中,如果遇到CSS的link元素,那么会由浏览器负责下载对应的CSS文件。浏览器下载完CSS文件,就会对CSS进行解析,从而生成对应的规则树,可以称为CSSOM(CSS对象模型)。 :::warning 在下载CSS文件过程中是不会影响渲染引擎解析HTML文件的。 :::
构建渲染树的过程
在解析完DOM树和CSS规则树后,就可以结合起来构建渲染树(Render Tree)了。渲染树是按照视觉元素显示的顺序排列的。它是文档的可视化表示。目的是为了能让浏览器正确地绘制元素。
:::warning 注意:
link元素不会阻塞构建DOM树,但会阻塞渲染树
Render Tree不会和DOM Tree有一一对应的关系,比如head元素、
display: none
的DOM就不会出现在渲染树中。 :::布局与绘制
布局
当节点被创建或添加到渲染树,它未必有位置或者大小。计算这些属性的过程被称为布局或回流。布局是确定元素在渲染树中的大小、位置等信息。 :::info 第一次确定节点的大小和位置,称之为布局(layout);
之后对节点的大小、位置修改重新计算称之为回流。
:::绘制
最后一步就是将节点绘制在屏幕上,在绘制阶段,浏览器将布局阶段计算的每个frame转为屏幕上实际的像素点;包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素(比如img)。
回流与重绘
回流
回流就是在布局完成之后,对节点的大小和位置进行改动的过程。
什么情况下会引起回流?DOM结构发生改变(children发生改变)
- 改变了布局属性(width、height、border、padding、margin等)
- 窗口resize
- 调用了
getComputedStyle()
方法 -
重绘
重回就是在第一次绘制完成之后,对节点或页面进行重新绘制的过程。
什么情况下会引起重绘? 回流
-
减少回流
回流一定会引起重绘,然而回流是一件相当损耗性能的过程,所以开发者应该在开发过程中尽可能少引起回流。
如何减少回流? 修改样式时一次性修改
- 比如修改大小,不该修改
*.style.widht = ?; *.style.height = ?
,应该使用class
样式的方式
- 比如修改大小,不该修改
- 减少频繁的DOM操作
- 可以在一个
DocumentFragment
中将要操作的DOM完成,再一次性操作。
- 可以在一个
- 尽量减少使用
getComputedStyle()
方法 对某些属性可以使用
position: absolote/fixed
特殊解析 – composite合成
在绘制过程中,可以将布局后的元素绘制到多个合成图层中,这是浏览器的一种优化手段。 :::info 在默认情况下:
标准流的元素属于同一个图层(layer)
- 有一些特殊属性的元素,会创建一个新的合成层(CompositingLayer),并且新的图层可以利用GPU来加速绘制
每个合成层都是单独渲染的。 ::: 哪些属性会引起合成层?
- 3D transform
- video、canvas、iframe
- opacity动画
- position: fixed
- will-change(实验性的特性)
animation
或transition
设置了opacity、transform;
分层确实可以提高性能,但是它以内存管理为代价,因此不应作为 web 性能优化策略的一部分过度使用。
script元素和页面解析的关系
前面所提到,在解析HTML过程中,遇到标记,不会停止对文档的解析,但是渲染引擎在解析HTML的过程中,遇到了