WebKit 简介¶
WebKit 是一个开源的 Web 浏览器引擎。它是 macOS 和 iOS 中的一个框架,被许多第一方和第三方应用程序使用,包括 Safari、邮件、备忘录、图书、新闻和 App Store。
什么是 WebKit?¶
WebKit 代码库主要由 C++ 编写,其中部分 C 和汇编代码主要在 JavaScriptCore 中,还有一些 Objective-C 代码用于与 Cocoa 平台集成。
它主要由以下组件组成,每个组件都在其自己的 Source 目录中:
- bmalloc - WebKit 的 malloc 实现,作为一种 bump pointer allocator。它提供了一项重要的安全功能,称为 IsoHeap,它将每种类型的对象隔离到自己的页面中,以防止使用后释放(use-after-free)导致的类型混淆攻击。
- WTF - Web 模板框架(Web Template Framework)的缩写。WebKit 的模板库。WebKit 代码库的其余部分除了使用 C++ 标准库中类似的类模板外,也经常取代它们,使用此模板库构建。它包含常见的容器类,如 Vector、HashMap (无序)、HashSet,以及整个 WebKit 中使用的智能指针类型,如 Ref、RefPtr 和 WeakPtr。
- JavaScriptCore - WebKit 的 JavaScript 引擎;通常缩写为 JSC。JSC 解析 JavaScript 并生成字节码,然后由以下四个层之一执行。需要多个层来平衡编译时间和执行时间。另请参阅 Phil 关于 JavaScriptCore 中的推测执行 的博客文章。
- 解释器(Interpreter) - 此层在 C++ 中读取并执行字节码指令。
- 基线 JIT(Baseline JIT) - 第一个即时编译(Just In Time compiler)层,既作为分析器,也比解释器有显著的速度提升。
- DFG JIT(DFG JIT) - 数据流图即时编译器(Data Flow Graph Just In Time compiler)使用数据流分析来生成优化的机器代码。
- FTL JIT(FTL JIT) - 超光速即时编译器(Faster than Light Just In Time compiler),使用 B3 后端。它是 JSC 中最快的层。JavaScriptCode 还为 macOS 和 iOS 应用程序实现了 JavaScriptCore API。
- WebCore - WebKit 最大的组件,此层实现了大多数 Web API 及其行为。最重要的是,此组件实现了 HTML、XML 和 CSS 解析器,并实现了 HTML、SVG 和 MathML 元素以及 CSS。它还实现了 CSS JIT,这是现存唯一的 CSS 即时编译器。它与几种树数据结构协同工作:
- 文档对象模型(Document Object Model) - 这是我们通过解析 HTML 创建的树数据结构。
- 渲染树(Render Tree) - 此树表示 DOM 树中每个元素根据 CSS 计算的可视化表示,并存储每个元素的几何布局信息。
- WebCore/PAL 和 WebCore/platform - 尽管技术上是 WebCore 的一部分,但这层是 WebCore 的平台抽象层,以便 WebCore 代码的其余部分可以在所有 WebKit 可运行的平台(macOS、iOS、Windows、Linux 等)上保持平台独立/无关。历史上,大部分代码都位于 WebCore/platform 中。目前有一个持续多年的项目,正在逐步将代码迁移到 PAL,同时我们移除对 WebCore 的反向依赖。
- WebKitLegacy (又名 WebKit1) - 此层在单进程中将 WebCore 与操作系统其余部分连接,并在 macOS 上实现 WebView,在 iOS 上实现 UIWebView。
- WebKit (又名 WebKit2) - 此层实现 WebKit 的多进程架构,并在 macOS 和 iOS 上实现 WKWebView。WebKit 的多进程架构由以下进程组成:
- UI 进程 - 这是应用程序进程。例如 Safari 和邮件。
- WebContent 进程 - 此进程加载并运行从网站加载的代码。Safari 中的每个标签页通常都有自己的 WebContent 进程。这对于保持每个标签页的响应性并保护网站彼此之间是重要的。
- 网络进程(Networking process) - 此进程负责处理网络请求以及存储管理。单个会话(默认或隐私浏览)中的所有 WebContent 进程共享网络进程中的单个网络会话。
- WebInspector / WebDriver - WebKit 为 Web 开发人员提供的开发工具和自动化工具。