Chrome是程序员的标配。从全球市场份额来看,其全球市场份额已经超过60%。在Chrome10周年之际,官方发布了一系列文章,以图文并茂的方式,清晰地阐述了现代浏览器的运行原理。渲染器进程的内部工作本文是关于现代浏览器如何工作的4部分系列文章中的第三篇。在上一篇文章中,我们介绍了多进程架构和导航的完整流程,而在这篇文章中,我们将探索渲染器进程内部发生了什么。渲染器进程涉及与Web性能相关的许多方面。由于在renderer进程中处理了很多逻辑,无法在一篇文章中完整说明,所以本文只是一个概览。如果你有兴趣深入挖掘,你可以在这篇文章《Why Performance Matters》中找到更多信息。呈现器进程处理发生在Web内容的所有选项卡中的逻辑,并且呈现器进程对此负责。在渲染器进程中,主线程处理服务器发送给用户的大部分代码。如果使用WebWorker或者ServiceWorker,JavaScript中的这部分代码将由工作线程处理。Compositor(合成器)和Raster(光栅)线程也在渲染器内部运行,允许高效流畅地渲染页面。渲染器进程的核心工作是将HTML、CSS和JavaScript转换成用户可以与之交互的网页。上图中描述了主线程、工作线程、合成器线程和光栅线程的渲染器进程,以及它们之间的关系。解析和构建DOM当渲染器进程收到导航请求并开始接收HTML数据时,主线程将开始处理文本字符串(HTML)并将其解析为DOM(文档对象模型)。DOM是网页内部的逻辑树型文档结构。Web开发人员可以通过JavaScript脚本与数据交互,并通过标准API操作DOM节点。将HTML文档解析成DOM是完全按照HTML协议进行的。而且在HTML协议中,浏览器对于错误的HTML是不会给出错误提示的。例如,这仍然是没有结束
标记的有效HTML。类似于嗨!我是Chrome!,b标签先于i标签关闭的错误会被HTML理解为Hi!我是Chrome!。这是因为HTML规范的主要原则是优雅地处理这些错误,而不是严格检查它们。如果您对规范感到好奇,可以阅读HTML规范的“解析器中的错误处理和异常情况简介”部分。解析器中错误处理和奇怪情况的介绍:https://html.spec.whatwg.org/multipage/parsing.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser子资源加载一个完整的网站通常包含图片、CSS和JS等外部资源,这些文件需要从网络或本地缓存中加载。主线程在解析和构建DOM时可以一一请求,但是为了加快速度,会同时使用“PreloadScanner”。如果“preloadscan”发现了