渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容。html
默认状况下,渲染引擎能够显示html、xml文档及图片,它也能够借助插件(一种浏览器扩展)显示其余类型数据,例如使用PDF阅读器插件,能够显示PDF格式,将由专门一章讲解插件及扩展,这里只讨论渲染引擎最主要的用途——显示应用了CSS以后的html及图片。web
本文所讨论的浏览器——Firefox、Chrome和Safari是基于两种渲染引擎构建的,Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safari和Chrome都使用webkit。后端
Webkit是一款开源渲染引擎,它原本是为Linux平台研发的,后来由Apple移植到Mac及Windows上,相关内容请参考http://webkit.org。浏览器
渲染引擎首先经过网络得到所请求文档的内容,一般以8K分块的方式完成。网络
下面是渲染引擎在取得内容以后的基本流程:dom
解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树布局
图2:渲染引擎基本流程spa
渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另外一棵树——render树。插件
Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。xml
Render树构建好了以后,将会执行布局过程,它将肯定每一个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每一个节点。
值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽量早的将内容呈现到屏幕上,并不会等到全部的html都解析完成以后再去构建和布局render树。它是解析完一部份内容就显示一部份内容,同时,可能还在经过网络下载其他内容。
图3:webkit主流程
图4:Mozilla的Geoko渲染引擎主流程
从图3和4中能够看出,尽管webkit和Gecko使用的术语稍有不一样,他们的主要流程基本相同。Gecko称可见的格式化元素组成的树为frame树,每一个元素都是一个frame,webkit则使用render树这个名词来命名由渲染对象组成的树。Webkit中元素的定位称为布局,而Gecko中称为回流。Webkit称利用dom节点及样式信息去构建render树的过程为attachment,Gecko在html和dom树之间附加了一层,这层称为内容接收器,至关制造dom元素的工厂。下面将讨论流程中的各个阶段。