页面从发送http请求到渲染页面全过程
从发送 HTTP 请求到页面渲染完成,浏览器会经历一系列复杂的步骤。以下是这一过程的详细说明:
1. 输入 URL 并解析
-
步骤:
-
用户在地址栏输入 URL(如
https://www.example.com)。 -
浏览器解析 URL,提取协议、域名、路径等信息。
-
-
结果:
- 确定请求的目标服务器和资源路径。
2. DNS 查询
-
步骤:
-
浏览器检查本地缓存是否有域名对应的 IP 地址。
-
如果缓存中没有,浏览器向 DNS 服务器发送查询请求,获取域名对应的 IP 地址。
-
-
结果:
- 获取目标服务器的 IP 地址(如
93.184.216.34)。
- 获取目标服务器的 IP 地址(如
3. 建立 TCP 连接
-
步骤:
-
浏览器通过 IP 地址和端口号(默认 80 或 443)与服务器建立 TCP 连接。
-
如果是 HTTPS,还会进行 TLS 握手,建立加密通道。
-
-
结果:
- 建立可靠的网络连接。
4. 发送 HTTP 请求
-
步骤:
-
浏览器构造 HTTP 请求报文,包括请求行、请求头和请求体。
-
请求行包含方法(如
GET)、路径(如/index.html)和协议版本(如HTTP/1.1)。 -
请求头包含客户端信息(如
User-Agent、Accept)、Cookie 等。 -
请求体包含需要发送的数据(如表单数据、JSON)。
-
-
结果:
- 服务器接收到请求并开始处理。
5. 服务器处理请求
-
步骤:
-
服务器根据请求路径和方法处理请求。
-
如果是静态资源(如 HTML、CSS、JS 文件),服务器直接返回文件内容。
-
如果是动态资源(如 PHP、Node.js),服务器执行相关代码并生成响应内容。
-
-
结果:
- 服务器生成 HTTP 响应。
6. 返回 HTTP 响应
-
步骤:
-
服务器构造 HTTP 响应报文,包括状态行、响应头和响应体。
-
状态行包含协议版本(如
HTTP/1.1)、状态码(如200)和状态描述(如OK)。 -
响应头包含服务器信息(如
Server)、内容类型(如Content-Type)等。 -
响应体包含返回的数据(如 HTML 内容、JSON 数据)。
-
-
结果:
- 浏览器接收到响应并开始解析。
7. 解析 HTML
-
步骤:
-
浏览器解析 HTML 文件,构建 DOM(文档对象模型)树。
-
遇到外部资源(如 CSS、JS、图片)时,发起额外的 HTTP 请求。
-
-
结果:
- 生成 DOM 树。
8. 解析 CSS
-
步骤:
-
浏览器解析 CSS 文件,构建 CSSOM(CSS 对象模型)树。
-
将 CSSOM 与 DOM 结合,生成渲染树(Render Tree)。
-
-
结果:
- 生成渲染树。
9. 执行 JavaScript
-
步骤:
-
浏览器解析并执行 JavaScript 代码。
-
JavaScript 可能会修改 DOM 或 CSSOM,触发重新渲染。
-
-
结果:
- 页面内容可能动态更新。
10. 布局(Layout)
-
步骤:
-
浏览器根据渲染树计算每个元素的位置和大小。
-
确定页面的布局结构。
-
-
结果:
- 生成布局信息。
11. 绘制(Paint)
-
步骤:
-
浏览器将布局信息转换为屏幕上的像素。
-
绘制页面的可视内容。
-
-
结果:
- 页面内容显示在屏幕上。
12. 页面加载完成
-
步骤:
-
当所有资源加载完成并渲染完毕后,页面加载完成。
-
触发
DOMContentLoaded和load事件。
-
-
结果:
- 用户可以与页面交互。
总结
| 步骤 | 描述 |
|---|---|
| 输入 URL 并解析 | 解析 URL,确定目标服务器和资源路径 |
| DNS 查询 | 获取域名对应的 IP 地址 |
| 建立 TCP 连接 | 与服务器建立可靠的网络连接 |
| 发送 HTTP 请求 | 构造并发送 HTTP 请求报文 |
| 服务器处理请求 | 服务器处理请求并生成响应 |
| 返回 HTTP 响应 | 服务器返回 HTTP 响应报文 |
| 解析 HTML | 构建 DOM 树 |
| 解析 CSS | 构建 CSSOM 树,生成渲染树 |
| 执行 JavaScript | 解析并执行 JavaScript 代码 |
| 布局 | 计算元素的位置和大小 |
| 绘制 | 将布局信息转换为屏幕上的像素 |
| 页面加载完成 | 触发 DOMContentLoaded 和 load 事件 |
理解页面从发送 HTTP 请求到渲染完成的全过程,有助于优化页面性能和用户体验。
更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github