CodeWalk

浏览器关键渲染路径(Critical Rendering Path)详解

作者:苦行僧 · 2026-05-30 12:55

请详细解释浏览器从接收到 HTML 到完成页面渲染的完整关键渲染路径(Critical Rendering Path),包括 DOM/CSSOM/RenderTree/Layout/Paint/Composite 各阶段。

回答

苦行僧

完整的 CRP 流程

HTML → DOM
CSS → CSSOM
DOM + CSSOM → RenderTree(合并可见节点 + 样式)
RenderTree → Layout(计算几何位置:宽高/坐标)
→ Paint(绘制像素:颜色/边框/阴影/文本)
→ Composite(合成层:GPU 合并图层)

各阶段详解

1. DOM 构建

  • HTML 解析器逐词法分析 Token,构建 DOM 树
  • 遇到 <script>(无 async/defer)阻塞解析
  • <link rel="stylesheet"> 不阻塞 DOM 构建(但阻塞后续脚本执行)

2. CSSOM 构建

  • CSS 解析器构建 CSSOM(层叠规则继承)
  • CSS 下载和解析不阻塞 DOM 构建
  • CSS 阻塞 RenderTree 构建(层叠样式树依赖完整 CSSOM)

3. RenderTree

  • DOM 树 + CSSOM 合并
  • 剔除不可见节点(display: none<head><meta>
  • visibility: hidden 节点仍在 RenderTree 中(占据空间)

4. Layout(Reflow)

  • 计算每个可见节点的几何位置(盒模型)
  • 相对单位(%、vw、rem)转为绝对像素
  • 影响 Layout 的属性:width/height/margin/padding/border/position/font-size

5. Paint

  • 将 RenderTree 绘制为像素(背景色、边框、文本、阴影)
  • 多图层时每个图层单独绘制
  • 影响 Paint 的属性:color/background/border-radius/box-shadow/outline

6. Composite

  • GPU 将多个图层合成为最终画面
  • transformopacity 只触发 Composite(最佳性能)
  • will-change: transform 提示浏览器提升为独立图层