浏览器页面渲染过程

88 阅读3分钟

从输入URL到页面展示出来经历的流程

1. DNS解析

当用户在地址栏输入内容之后,浏览器会解析是否是URL,如果是URL开始进行DNS解析,解析过程分为如下几个步骤:

  1. 询问浏览器DNS缓存。
  2. 访问本地操作系统DNS缓存(即查找本地host文件)。
  3. 询问互联网服务提供商的DNS服务器。
  4. 询问根服务器。

2. 建立连接

浏览器执行完DNS解析拿到ip地址之后,根据ip地址和服务器进行通信建立连接。建立连接过程(三次握手)如下:

  1. 浏览器发送请求至服务器,表示我将要发送请求。
  2. 服务端接收到请求之后发送数据包给浏览器,表示我已经收到通知,告知浏览器发送请求。
  3. 浏览器发送请求,通知服务端我要开始发送请求。

3. 数据传输

三次握手完成之后,浏览器和服务端开始进行数据传输。数据传输过程如下:

  1. 浏览器发送请求,服务端在接收到数据包之后发送确认数据包已收到的消息到客户端,此过程不断重复直至数据发送完成。
  2. 浏览器在发送数据包后如未收到确认的消息将会重新发送该数据包,即TCP的重发机制。
  3. 服务端在接收完所有的数据包之后按照TCP头中的信息进行排序形成完整的数据包。
  4. 服务端处理数据包并发送结果至浏览器。

4. 断开连接

当数据传输完成后断开连接。断开连接的过程如下:

  1. 浏览器发送请求,申请断开连接,进入等待阶段,此时不会发送数据,但会继续接收数据。
  2. 服务端接收请求后,告知浏览器已明白,此时服务端进入等待状态,不会再接收数据,但会继续发送数据。
  3. 浏览器收到后,进入下一阶段等待。
  4. 服务端发送完剩余的数据后,告知浏览器可以断开连接,此时服务端不会发送和接收数据。
  5. 浏览器收到后,告知服务端我开始断开连接。
  6. 服务端收到后,开始断开连接。

5. 页面渲染

浏览器在接收完数据后,开始进行页面渲染。渲染过程如下:

  1. 根据HTML元素构建DOM树。
  2. 根据css构建CSSOM。此过程会进行规范css、计算元素样式(继承父级样式)。
  3. 在构建DOM树和CSSOM的过程中,如遇到同步加载的js会优先加载js。(可使用defer或sync实现异步加载)
  4. 根据DOM树和CSSOM生成Render Tree。
  5. 根据Render Tree对节点进行计算,确定每个节点在页面中的宽度、高度和位置。(第一次的过程未布局,第二次为回流)
  6. 为具备层叠上下文的元素创建对应的图层。
  7. 将图层的绘制拆分为绘制指令,并按照图层绘制顺序形成一个绘制列表。
  8. 有了绘制列表之后,浏览器根据当前视口的大小将图层进行分块处理,然后合成线程会对视口附近的图块生成位图。
  9. 将绘制结果显示在用户界面上。

补充

根据加载过程分析可以把js加载放到body下面或使用defer/sync来加快页面加载速度。