本文依据朱永盛老师的《WebKit技术内幕》一书做为参考,结合网络共享资源对Webkit的历史和技术点进行随笔记录,或跳过一些理解不到位的。编程
1、浏览器简史

- 93年网景浏览器(netscape)诞生,宣布第一代浏览器的告世。
- 95年微软IE(Internet Explorer)受益于window系统的捆绑安装,将老大哥网景拉下马,并一家独大。
- 98年败落的网景公司的工程师们联合成立了Mozilla基金会,主导开发了著名的开源项目火狐(Firefox)浏览器,04年发布1.0版本。
- 至此,根正苗红并拥有高用户体验的 Firefox 逐步蚕食不可一世IE浏览器的市场份额。
- 此时,苹果发布了 Safari 浏览器,开源了大名鼎鼎的 Webkit 渲染引擎的项目代码。
- 08年,Google以 Webkit 为内核,建立了Chromium,在Chromium保持技术先进的基础上(试验田),Google发布了更稳定版本的Chrome浏览器,Chrome在各个方面作的很好,迅速加入IE、Firefox瓜分浏览器市场份额的大战,三足鼎立。
2、HTML5下的浏览器

- 浏览器基本功能:网络(网络是Web应用的瓶颈)、资源管理、网页浏览、多页面管理、插件和扩展、帐号和同步、安全机制、开发者工具。
- IE浏览器到目前为止只支持Window系统,Firefox尚不支持IOS系统。
- HTML5做为新一代的网页标准,是一系列新技术的集合:离线、储存、链接、文件访问、语义、音频和视频、3D和图形、展现、性能、其余。
- HTML5标准问世,各大浏览器厂商都齐头向实现这些相关功能前进,连自大的微软也不得不迫于形势放下了一向以来的骄纵风格。
- 用户代理(User Agent)是一个颇有趣的现象,原本这是浏览器向服务提供商提供的相似身份证实的头部文件信息,其余后来的浏览器为了享有一样的服务提供的定制内容,不得不假装了这个头部信息。(这些假装者不只有臭名昭著的IE更有Safari、Chrome等现代浏览器)
3、浏览器内核

- 浏览器内核一般也是渲染引擎,根据描述构建数学模型,经过模型生成图像。
- 主流的浏览器内核有Trident、Gecko、WebKit,分别是IE、火狐、Chrome的内核。
(13年Google的Blink内核其实根源也是WebKit,Blink是WebKit的分支,原因是Google和Apple的对WebKit的进化概念相左)。浏览器
- 渲染引擎主要包括 HTML解释器、CSS解释器、布局、JavaScript引擎、绘图。
4、WebKit的渲染过程

根据数据的流向,将渲染过程分红三个阶段。安全
第一个阶段是从网页的RUL的构建完DOM树
- 当用户输入URL时,WebKit调用其资源加载器加载该URL对应的网页。
- 加载器依赖网络模块创建链接,发送请求并接收答复。
- WebKit接收到各类资源或数据,这些资源多是同步或异步获取的。
- 网页被交给HTML解释器转换成一些列的词语(Token)。
- 解释器根据词语构建节点(Node),造成DOM树。
- 若是节点是JavaScript的话,调用JavaScript引擎解释并执行。
- JavaScript代码可能会修改DOM树的结构。
- 若是节点须要依赖其余资源,例如图片、CSS、视频等,调用资源加载器来加载他们,但它们是异步的,不会阻碍当前DOM树的继续构建;若是是JavaScript资源URL(并无标记异步方式async),则须要中止当前DOM树的建立,直到JavaScript的资源加载并被JavaScript引擎执行后才继续DOM树的建立。
第二个阶段是从DOM树到构建完WebKit的绘图上下文
- CSS文件被CSS解析器解析成内部表示结构。
- CSS解释器工做完以后,在DOM树上附加解释后的样式信息,这就是RenderObject树。
- RenderObject节点在建立的同时,Webkit会根据网页的层次结构建立RenderLayer树,同时构建一个虚拟的绘图上下文。
第三个阶段是从绘图上下文到生成最终的图像
- 绘图上下文是一个与平台无关的抽象类,它将每一个绘图操做桥接到不一样的具体实现类,也就是绘图具体实现类。
- 绘图实现类也可能有简单的实现,也有可能有复杂的实现。在Chromium中,它的实现至关复杂,须要Chromium的合成器来完成成复杂的多进程和GPU加速机制,这在后面会涉及。
- 绘图实现类将2D图形库或者3D图形库绘制的结果保存下来,交给浏览器来同浏览器界面一块儿显示。
5、WebKit架构
WebKit之因此支持不少浏览器和操做系统,它的秘密就是保持核心,充分解耦。网络

- 最底层是“操做系统”,浏览器属于应用层,理所当用须要调用操做系统与硬件的驱动处理。
- 操做系统之上是各种WebKit工做依赖的第三方库,这些库是Webkit运行和处理的基础包。好比:图形库,网络库,视频库。加载和渲染网页天然须要运用到他们。如何更高效对接这些底层库,并设计健壮的架构来支撑未来可能愈发多和复杂的基础库,正是咱们浏览器开发者所要考虑的重要问题。
- 在这二者之上,咱们终于回到正道WebKit的项目部分。这其中包括大多数浏览器所共享的WebCore部分和非共享的WebKit Ports部分。
- WebCore具体包括浏览器加载和渲染网页的基础部分,好比HTML解释器、CSS解释器、SVG、DOM、渲染树等。JavaScriptCore引擎是WebKit的默认JavaScript引擎,事实上,WebKit对JS引擎并不高度聚合,在Google的Chromium中,它被替换成了V8引擎。
- Webkit Ports是差别各类操做系统和浏览器所产生的可自设计部分,其中包括硬件加速架构、网络栈、视频解码、图片解码等。
- 在WebCore和WebKit Ports之上是对外暴露的嵌入式编程接口。这些接口提供给浏览器调用(并不绝对只是浏览器)。