用户打开一个 URL 并在浏览器中完全渲染页面的全过程可以分为多个阶段,从用户输入 URL 开始,到页面完全显示出来结束。
整个流程可以简单分为以下几个步骤:
1.1. 工作流程
- 用户请求:用户向某个网站发出请求(如打开一个网页或视频)。
- CDN调度:CDN 根据用户的 IP 地址判断最近的 CDN 节点,并将请求定向到该节点。
- 缓存检查:CDN 节点检查是否有该内容的缓存。
- 有缓存:直接返回缓存内容给用户
- 无缓存:向原始服务器请求内容并缓存,然后返回给用户
- 返回内容:用户接收到响应内容。
1.2. 完整流程
完整流程共分为 8 个核心步骤:
- 用户输入 URL
- DNS 解析 -> 获取 IP 地址
- 建立 TCP 连接 (三次握手)
- 发送 HTTP 请求
- 服务器处理请求并返回响应
- 浏览器接收响应 -> 构建 DOM 和 CSSOM
- 构建渲染树 -> 布局 -> 绘制
- 执行 JS -> 完成页面渲染
1.3. 详细解释
- 用户输入 URL
当用户在浏览器地址栏中输入 URL 并按下回车,浏览器会开始处理这个请求。
- DNS 解析
浏览器首先通过 DNS (域名系统)解析 URL 中的域名,将其转换为 IP 地址。
这个过程可能涉及以下步骤:
- 浏览器缓存:浏览器先查找本地缓存中是否已经有该域名的 IP 地址
- 操作系统缓存:如果浏览器没有缓存,操作系统会查找其缓存
- 路由器缓存:如果操作系统没有缓存,查询会继续通过路由器
- ISP 的 DNS 服务器:最终,查询可能需要通过互联网服务提供商(ISP)的 DNS 服务器获取 IP 地址
- 建立 TCP 连接
通过 IP 地址确定了目标服务器后,浏览器与服务器通过 TCP 三次握手 建立连接。三次握手过程如下:
① 客户端发送 SYN (同步)请求
② 服务器收到请求后,返回 SYN + ACK
③ 客户端收到 ACK 后,发送 ACK 确认连接
- 发送 HTTP 请求
一旦 TCP 连接建立,浏览器向服务器发送 HTTP 请求,包括请求头和相关参数。请求头中包含以下信息:
- 请求的资源类型(HTML、CSS、JS等)
- 浏览器信息(User-Agent)
- 可接收的内容类型(Accept)
- 缓存信息(Cache-Control)等
- 服务器处理请求
服务器接收到请求后,处理请求并返回相应的资源(HTML文件、图片、CSS、JavaScript 等)。这一步包括:
- 服务器可能需要从数据库或文件系统中获取数据
- 如果是动态网页,服务器需要运行相关代码生成 HTML 内容(例如 PHP、Node.js 等服务器端语言)
- 服务器返回 HTTP 响应
服务器返回 HTTP 响应,包括状态码(如 200 OK)、响应头(例如内容类型、缓存控制等)和请求的资源数据(例如 HTML、CSS、JS 等)
- 浏览器接收响应并开始解析
浏览器接收到响应后,开始解析 HTML 文档并逐步构建 DOM 树。同时,浏览器会发出进一步的请求以获取页面中引用的资源:如果 HTML 中有外部的 CSS 文件、JS 文件或图片资源等,浏览器会并行发送 HTTP 请求来获取这些资源
- 构建 DOM 和 CSSOM
- DOM 树构建:浏览器从 HTML 构建文档对象模型(DOM),每个 HTML 标签都会转换成 DOM 树的节点。
- CSSOM 构建:浏览器解析 CSS 文件或内嵌的 CSS 样式,生成 CSSOM (CSS对象模型)
- 合并 DOM 和 CSSOM,生成渲染树
当 DOM 和 CSSOM 都构建完成后,浏览器将它们结合在一起,生成 渲染树。渲染树包含页面的可见元素以及它们的样式信息。
- 布局(Layout)
浏览器根据渲染树进行布局,计算每个元素的位置和大小。这一阶段决定了页面元素在屏幕上的确切位置
- 绘制(Painting)
在完成布局后,浏览器开始 绘制,将渲染树的每个节点绘制到屏幕上,生成页面的视觉内容。
- JS执行与事件绑定
(1)如果页面中包含 JS 文件,浏览器会根据 HTML 的解析顺序和脚本位置决定何时下载并执行 JS
- 默认情况下,JS 是阻塞解析的,意味着浏览器会暂停 DOM 树的构建,直到脚本执行完毕
- 如果脚本被标记为 async 或 defer,则浏览器可以异步加载和执行脚本
(2)浏览器执行 JS 后,可能会修改 DOM 或 CSSOM ,并重新触发布局和绘制
- 页面完全渲染
当所有资源加载完毕、DOM 构建完成、JS 执行完毕,页面内容会被完整呈现给用户。
- 浏览器空闲与后续交互
页面渲染完成后,浏览器处于等待状态,用户可以进行交互(如点击按钮、输入表单)。任何用户交互事件都会触发 JS 事件监听器,可能引发进一步的页面重绘(Repaint)或 重新布局(Reflow)。