好久想写一篇关于浏览器内核的博客了,一直没抽出时间,幸好白夜追凶完结了,赶紧写出来。
说浏览器内核之前先聊聊几个浏览器大佬,目前有可观市场份额的浏览器有5个,分别是Internet Explorer、Firefox、Safari、Chrome和 Opera浏览器。
来看看市场份额占有率:
数据来自StatCounter2017年九月的数据统计。
其中Firefox、Safari和Chrome是部分开源的,他们三个的份额占到了将近80%,看来开源才是互联网发展趋势。
本文只就浏览器渲染引擎部分进行讨论。
渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容。这是每一个浏览器的核心部分,所以渲染引擎也称为浏览器内核。
默认情况下,渲染引擎可显示 HTML 和 XML 文档及图片。通过插件(或浏览器扩展程序),还浏览器渲染引擎也可以显示其它类型的内容。例如,使用 PDF 查看器插件就能显示 PDF 文档。
在本章中,我们将集中介绍其主要用途:显示应用了CSS的 HTML 内容和图片。
Firefox 使用的是 Gecko,这是 Mozilla 公司“自制”的渲染引擎。而 Safari 和 Chrome(28版本以前)浏览器使用的都是 Webkit。
2013年7月10日发布的Chrome 28 版本中,Chrome浏览器开始正式使用Blink内核。所以,Webkit已经成为了Chrome浏览器的前内核。
渲染引擎一开始会从网络层获取请求文档的内容,通常以8K分块的方式完成。
获取了文档内容之后,渲染引擎开始正式工作,其基本流程:
渲染引擎解析HTML文档,并将文档中的标签转化为dom节点树,即”内容树”。同时,它也会解析外部CSS文件以及style标签中的样式数据。这些样式信息连同HTML中的”可见内容”一道,被用于构建另一棵树——”渲染树(Render树)”。
渲染树由一些带有视觉属性(如颜色、大小等)的矩形组成,这些矩形将按照正确的顺序显示在频幕上。
渲染树构建完毕之后,将会进入”布局”处理阶段,即为每一个节点分配一个屏幕坐标。再下一步就是绘制(painting),即遍历render树,并使用UI后端层绘制每个节点。
值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。
主流程示例: