关键渲染路径
1. 什么是关键渲染路径?
关键渲染路径是指浏览器将 HTML、CSS、JavaScript 转化为屏幕上实际像素的步骤全过程。优化首屏加载的核心就是缩短这条路径,减少阻塞资源的数量和大小。
2. 核心步骤
- 构建 DOM 树
浏览器解析 HTML,构建文档对象模型树。
- 构建 CSSOM 树
解析 CSS,构建 CSS 对象模型树。由于没有样式无法渲染网页,这通常是一个阻塞渲染的阶段。
- 执行 JavaScript
解析到
<script> 标签时,主线程会挂起,下载并执行 JS。由于 JS 可以修改 DOM 和 CSSOM,它的默认执行会阻塞渲染。
- 生成渲染树
将 DOM 树和 CSSOM 树合并。剔除不可见节点(如
display: none),生成用于布局计算的渲染树。
- 布局
根据渲染树,计算每个节点在屏幕上的确切坐标和宽高。
- 绘制与合成
将节点转换为屏幕上的像素,并将多个图层合并渲染到屏幕上。
3. 优化策略
(1) 优化 CSSOM 构建
因为浏览器在构建完 CSSOM 前会阻塞渲染,所以需要优先处理核心 CSS。
- 内联首屏关键 CSS:将首屏视口必需的 CSS 直接写在 HTML 的
<style> 标签中,减少一次网络请求。
- 媒体查询:对于非首屏必需的 CSS(如打印样式,或者不匹配当前设备的媒体查询样式),使用
media 属性,让其异步加载,不阻塞首次渲染。
(2) 优化 JavaScript 执行
传统的 <script> 会中断 DOM 解析。
- 使用 defer:异步下载脚本,但在 DOM 解析完毕后才按顺序执行,不会阻塞渲染。
- 使用 async:异步下载脚本,下载完成后立即暂停 DOM 解析并执行。适用于无依赖的独立脚本(如统计代码)。
(3) 资源体积与优先级控制
- 压缩与混淆:使用 Gzip/Brotli 压缩传输体积,移除无用代码和注释。
- 资源预加载:使用
<link rel="preload"> 提前声明后续需要的高优先级资源(如关键字体或主图),让浏览器尽早发起请求。