浏览器工作流

p.s:本文摘至野狗公众号发的文章

浏览器工作流步骤

总的来说,浏览器工作流就是以下几个步骤:

  1. 创建DOM树
  2. 创建渲染树
  3. 布局(reflow)
  4. 绘制(painting)

图解

NOTE:在下面这张图中,配图文字使用的是Webkit引擎的术语。所有的浏览器都是遵循类似的工作流,仅在细节处略有不同。
browserFlow

创建DOM树

一旦浏览器接收到一个HTML文件,渲染引擎(render engine)就开始解析它,并根据HTML元素(elements)一一对应地生成DOM 节点(nodes),组成一棵DOM树。

创建渲染树

同时,浏览器也会解析来自外部CSS文件和元素上的inline样式。通常浏览器会为这些样式信息,连同包含样式信息的DOM树上的节点,再创建另外一个树,一般被称作渲染树(render tree)

创建渲染树背后的故事

WebKit内核的浏览器上,处理一个节点的样式的过程称为attachment。DOM树上的每个节点都有一个attach方法,它接收计算好的样式信息,返回一个render对象(又名renderer)

Attachment的过程是同步的,新节点插入DOM树时,会调用新节点的attach方法。

构建渲染树时,由于包含了这些render对象,每个render对象都需要计算视觉属性(visual properties);这个过程通过计算每个元素的样式属性来完成。

布局 Layout

又被简称为Reflow

构造了渲染树以后,浏览器引擎开始着手布局(layout)。布局时,渲染树上的每个节点根据其在屏幕上应该出现的精确位置,分配一组屏幕坐标值。

绘制 Painting

接着,浏览器将会通过遍历渲染树,调用每个节点的paint方法来绘制这些render对象。paint方法根据浏览器平台,使用不同的UI后端API(agnostic UI backend API)。 通过绘制,最终将在屏幕上展示内容。
再来看Virtual DOM

好啦,现在你已经简单过了一遍浏览器引擎的渲染流程,你可以看到,从创建渲染树,到布局,一直到绘制,只要你在这过程中进行一次DOM更新,整个渲染流程都会重做一遍。尤其是创建渲染树,它需要重新计算所有元素上的所有样式。

在一个复杂的单页面应用中,经常会涉及到大量的DOM操作,这将引起多次计算,使得整个流程变得低效,这应该尽量避免。