⚡ 30 秒速记

  • 解析得到结构,样式计算确定展示规则
  • 布局处理几何信息,绘制记录视觉内容
  • 光栅化把绘制内容转成像素
  • 合成组织可显示结果,并非每帧都重跑全部阶段
  • 更新范围与图层策略都要实测

页面渲染可以拆成算结构、算位置、画内容、变像素和合成画面几步。 文档与样式决定元素怎样展示,布局给出尺寸与位置,绘制和光栅化把视觉内容准备好,再由合成过程形成画面。后续变化只需要重做受影响的工作,比如颜色通常不要求重新排版。知道每步做什么,才能从性能记录里分清是节点太多、布局反复,还是绘制区域过大。

版本校准: 原理文章中的代码代表特定实现与写作时间。应用到当前项目时,应先确认浏览器、框架或工具的主版本,再区分稳定的规范语义、可变化的内部实现和项目自身约束。

# 浏览器的内部结构

从结构上来说,浏览器主要包括了八个子系统:用户界面、浏览器引擎、渲染引擎、网络子系统、JavaScript 解释器、XML 解析器、显示后端、数据持久性子系统

这些子系统组合构成了我们的浏览器。页面的加载和渲染过程,离不开网络子系统、渲染引擎、JavaScript 解释器和浏览器引擎。

以前端开发最常使用的 Chrome 浏览器为例, Chrome 浏览器是使用多进程架构的方式来管理这些子系统。

# Chrome 多进程架构

Chrome 浏览器采用的多进程架构,主要包括四个进程

  • 浏览器进程:选项卡之外的所有内容都由浏览器进程处理,浏览器进程则主要用于控制和处理用户可见的 UI 部分(包括地址栏,书签,后退和前进按钮)和用户不可见的隐藏部分(例如网络请求和文件访问)
  • GPU 进程:该进程用于完成图像处理任务,同时还支持分解成多个进程进行处理
  • 渲染器进程:Chrome 浏览器中支持多个选项卡,其中每个选项卡在单独的渲染器进程中运行,渲染器进程主要用于控制和处理选项卡中的网站内容显示
  • 插件进程:管理 Chrome 浏览器中的各个插件

对于“在浏览器的地址栏中输入 URL,按下回车键,到浏览器渲染页面”这个过程,浏览器内部会通过浏览器进程和渲染器进程,进行很多交互逻辑,最终才得以将页面内容显示在屏幕上

其中,浏览器进程和渲染器进程同样支持多线程,包括以下这些线程。

这些线程其实并不陌生,在前面介绍的内容中有提到,比如:

  • 在页面的加载过程中,涉及 GUI 渲染线程与 JavaScript 引擎线程间的互斥关系,因此页面中的<script>和<style>元素设计不合理会影响页面加载速度;
  • 在 UI 线程、网络线程、存储线程、浏览器事件触发线程、浏览器定时器触发线程中,I/O 事件通过异步任务完成时触发的函数回调,解决了单线程的 Javascript 阻塞问题。

下面我们再来看下 Chrome 浏览器中页面的渲染过程,包括浏览器进程和线程如何通信来显示页面。

# 浏览器中页面的渲染过程

首先我们将浏览器中页面的渲染过程分为两部分。

  • 页面导航:用户输入 URL,浏览器进程进行请求和准备处理。
  • 页面渲染:获取到相关资源后,渲染器进程负责选项卡内部的渲染处理。
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部