浏览器访问页面的渲染过程

246 阅读3分钟

访问URL的响应过程

  1. 浏览器收到URL,建立页面进程,开启网络请求线程
  2. 发起完整的HTTP请求:进行DNS解析(获取域名对应IP地址)建立通信链路,经历3次TCP握手
  3. 服务器接收到请求,后端处理请求
  4. 前后端之间的HTTP交互(响应请求)和涉及的缓存机制
  5. 浏览器接收到数据包后的关键渲染路径
  6. JS引擎的解析js代码过程

浏览器的进程

浏览器每打开一个新页面,都会建立一个新的进程并开启相应的请求线程。

如下,我们打开浏览器的任务管理器可以看到: image.png

主要进程与线程

image.png 通过浏览器的任务管理器,我们可以发现,浏览器自身就会开启以下进程。开启多个线程处理的好处是避免某个进程崩溃时,影响浏览器主进程或其他进程(网络、存储、页面等进程)

  • 浏览器主进程
  • GPU进程
  • Network Service 网络进程
  • Storage Service 存储进程
  • Audio Service 音频进程
  • 扩展程序进程(安装启用的扩展程序也会建立进程)
  • 渲染程序进程 - 也称为浏览器内核,默认会为每个页面建立独立渲染进程。
  • 页面进程,所访问的每个页面都会建立对应的进程,负责将HTML、css、js等资源转为可交互页面。其中包含多个子线程(JS引擎、GUI宣传、事件触发、定时器触发、异步HTTP请求等线程)

构建对象模型

  • DOM - 树 文档对象模型
  • CSSOM - 树 层叠样式模型

建立HTTP请求

进行DNS解析获取访问域名所对应的IP地址,然后建立通信链路。

DNS解析的过程

image.png

建立TCP连接

建立TCP连接会经历3次握手,作用是为了确认双方的收发能力都是正常的。需要3次握手是因为一般情况下,客户端请求建立连接请求发送后没有得到响应会再次发送,如果仅握手2次,就会导致多次建立连接浪费资源,而3次握手,以第三个信息为准则能避免上诉情况。 三次握手:

  1. 客户端请求建立连接
  2. 服务端确认应答及请求建立连接
  3. 客户端确认应答 image.png

渲染绘制

按照文档对象模型和层叠样式模型的规则,将两个对象模型合并为渲染树,渲染树只包含可见节点。

渲染步骤:

  1. 从生成DOM树的根节点开始向下遍历每个子节点,忽略所有不可见的节点(脚本或css标记为不可见的隐藏的),因为不可见节点不会出现在渲染树中。
  2. 在CSSOM中为每个可见的子节点找到对应的规则并应用
  3. 根据所得到的渲染树,计算他们在视图中的位置与大小,这一步输出的是一个 盒模型
  4. 将每个节点完成绘制,呈现在屏幕上。

DOM 树

image.png

CSSOM 树 image.png

最后建立的 渲染树

image.png

整渲染树构建过程、布局计算以及绘制过程所需要的时间取决于实际文档内容的大小。文档越大整个构建渲染过程所花费时间就越长,所以关键渲染路径的执行快慢,将直接影响首屏加载时间的性能指标

当首屏渲染完成后,用户交互过程中或者接口调用响应时更改了渲染树的结构,如DOM改变或者CSS布局大小的改变,这个渲染过程就会重新再执行一遍。这一过程会与交互性能指标相关

具体的渲染过程,与耗时情况,可以打开性能面板进行查看。

image.png