前端页面加载过程
前端页面加载过程是一个复杂的流程,涉及多个阶段和技术的协同工作。以下是详细的流程分析,涵盖从用户发起请求到页面完全渲染的全过程:
一、导航阶段(Navigation Phase)
-
用户输入URL
- 浏览器检查URL合法性(协议/域名等)。
- 若输入为搜索关键词,调用默认搜索引擎。
-
读取缓存
- Service Worker 缓存:优先检查Service Worker是否缓存了资源(若有,直接返回)。
- HTTP缓存:检查内存缓存(Memory Cache)和磁盘缓存(Disk Cache):
强缓存(Cache-Control / Expires):未过期直接使用缓存。协商缓存(ETag / Last-Modified):向服务器验证资源是否更新。
-
DNS解析
- 查询域名对应的IP地址:
- 浏览器缓存 → 系统缓存(hosts文件) → 路由器缓存 → ISP DNS服务器 → 递归查询(根域名→顶级域名→权威DNS)。
- 优化:
DNS预解析(<link rel="dns-prefetch">)。
- 查询域名对应的IP地址:
-
建立TCP连接
- 三次握手(SYN → SYN-ACK → ACK)建立可靠连接。
- 优化:
Keep-Alive复用连接(HTTP/1.1默认)。
-
TLS握手(HTTPS)
- 协商加密算法 → 验证证书 → 交换密钥(非对称加密)→ 生成会话密钥(对称加密)。
- 优化:
TLS False Start(提前发送数据)。
二、资源请求阶段(Resource Request Phase)
-
发送HTTP请求
- 浏览器构造HTTP请求报文:
- 请求行(方法、URL、协议版本)。
- 请求头(Cookie、User-Agent、Accept-*等)。
- 请求体(POST数据)。
- 浏览器构造HTTP请求报文:
-
服务器处理请求
- 后端应用处理逻辑(路由、数据库查询等)。
- 返回HTTP响应(状态码、响应头、响应体)。
-
接收响应
- 浏览器根据状态码处理:
3xx:重定向(按Location头重新请求)。200:解析响应内容(如HTML)。
- 浏览器根据状态码处理:
三、解析与渲染阶段(Parsing & Rendering Phase)
-
构建DOM树
- 流程:graph LR A[字节流] --> B[字符流] --> C[令牌化 Tokenization] --> D[生成DOM节点] --> E[构建DOM树]
- 阻塞问题:
<script>会阻塞DOM解析(除非加async/defer)。
- 流程:
-
构建CSSOM树
- 解析CSS(内联/外部/用户代理样式表),生成CSSOM(层叠样式树)。
- 关键点:CSSOM构建会阻塞渲染(避免未样式化的内容闪现)。
-
合并渲染树(Render Tree)
- 结合DOM和CSSOM,生成包含可见元素的渲染树(忽略
display:none的元素)。
- 结合DOM和CSSOM,生成包含可见元素的渲染树(忽略
-
布局(Layout / Reflow)
- 计算每个节点的几何信息(位置、尺寸)。
- 受视口大小、字体缩放等影响(响应式设计会触发多次布局)。
-
绘制(Paint)
- 将渲染树转换为屏幕上的像素:
- 分层绘制(Layer) → 栅格化(Rasterization)→ 合成(Composition)。
- 优化:GPU加速(
transform/opacity跳过布局和绘制)。
- 将渲染树转换为屏幕上的像素:
-
合成显示(Compositing)
- 浏览器合并各图层,通过显卡输出到屏幕。
四、异步加载与事件阶段
-
加载子资源
- 解析HTML时遇到
<img>,<script>,<link>等,发起异步请求。 - 注意:JS可能阻塞渲染(使用
defer/async优化)。
- 解析HTML时遇到
-
执行JavaScript
- 触发
DOMContentLoaded事件(DOM解析完成)。 - 所有资源(图片等)加载完成后触发
load事件。
- 触发
-
持续交互
- 用户操作触发重绘(Repaint)或回流(Reflow):
- 回流:布局改变(如窗口缩放、元素位置变化)。
- 重绘:样式改变不影响布局(如颜色变化)。
- 用户操作触发重绘(Repaint)或回流(Reflow):
关键优化策略
| 阶段 | 优化手段 |
|---|---|
| 网络 | HTTP/2多路复用、CDN分发、资源压缩(Brotli)、预加载(preload)、预连接(preconnect) |
| 解析 | 异步JS(async/defer)、CSS内联关键样式、延迟非关键CSS |
| 渲染 | 减少DOM深度、避免频繁重排(使用transform)、防抖/节流事件处理 |
| 缓存 | Service Worker离线缓存、HTTP缓存策略、LocalStorage存储 |
完整流程图
sequenceDiagram
participant User
participant Browser
participant DNS
participant Server
participant GPU
User->>Browser: 输入URL
Browser->>Browser: 检查缓存(Service Worker/HTTP)
alt 缓存命中
Browser-->>User: 直接加载资源
else 缓存未命中
Browser->>DNS: 域名解析
DNS-->>Browser: 返回IP
Browser->>Server: TCP握手 + TLS(HTTPS)
Server-->>Browser: 建立连接
Browser->>Server: 发送HTTP请求
Server->>Server: 处理请求
Server-->>Browser: 返回HTTP响应
end
Browser->>Browser: 解析HTML→构建DOM
Browser->>Browser: 解析CSS→构建CSSOM
Browser->>Browser: 合并渲染树→布局→绘制
Browser->>GPU: 图层合成显示
Browser-->>User: 页面呈现
Browser->>Browser: 执行JS/加载子资源
Browser-->>User: 触发DOMContentLoaded/load事件
理解这些流程有助于针对性地优化性能(如减少重排、延迟加载非关键资源)。实际场景中可使用Chrome DevTools的Performance面板分析具体瓶颈。

浙公网安备 33010602011771号