Dive Into Browser(一):浏览器架构
随着 Web 技术的发展,现代浏览器已经具备了空前的复杂度,chromium 连带着 blink 成为了千万行代码的庞然大物,单是总览的设计文档以及相关资料的数量就足够令人劳神费力了。
虽然想着把资料整合的详细一些,对于 chromium 整体的理解更为深入之后再回过头来写几篇资料整理,但是经过这中间的跨度怕是前头学的东西都落的七七八八了(更不用说工头安排了开发任务,抽不出足够的成块时间 )。
在这里整理的资料内容主要基于 chromium 项目官网 的设计文档。里头的内容质优量足,不过有些 outdated 的内容需要自己甄别。
浏览器部件
在介绍浏览器的架构之前,首先来理一理现代浏览器需要什么。
对照着诸位自己正盯着看的浏览器界面以及上图,让我们来看看现代浏览器里头都包含了哪些部件:
- User Interface: 用户交互界面,里头装着地址栏,书签栏、标签栏等。除了主窗口所显示的内容,其余的部分都属于用户界面的内容;
- Browser Engine: 浏览器引擎负责与渲染引擎之间的通信,传送相应的指令;
- Rendering Engine: 渲染引擎将对应的内容进行呈现,例如对 html 的绘制;
- Networking: 网络模块用于处理网络调用,例如 Http 请求,其将不同平台的网络资源进行封装以提供统一的平台无关的调用接口;
- JavaScript Interpreter: JavaScript 解释器很直白,就是对 JavaScript 代码进行解析以及执行;
- UI Backgroud: UI 后端处理基本的窗口小部件的绘制,例如组合框以及窗口,其同样对底层操作系统提供的界面方法进行封装,并向上提供接口;
- Data Persistence: 数据持久化处理浏览器工作中需要写入磁盘的数据,例如 Cookie、WebStorage (其为 HTML 规范所定义的轻量级数据库)等。
需要注意的,上述的各个部件并不代表其每个部件都是一个独立的进程,而仅仅代表起是具有某个功能的“模块”。其相互之间的组织结构以及通讯结构,将在接下来的内容中呈现。
多进程架构
为了应对(很有)可能出现的崩溃以及安全问题,chromium 为浏览器设计了多进程的架构:
Chromium 主要包含 主进程(浏览器进程,browser process) 以及 渲染进程(render process)。其中:
- browser process 负责绘制浏览器 User Interface 以及插件进程的管理;
- render process 也就是 renderer,其负责对 HTML 进行解析以及布局(在 chromium 中 render process 使用 blink