什么是关键渲染路径
关键渲染路径(Critical Rendering Path)是浏览器将 HTML、CSS 转换为屏幕像素的过程。CSS 是渲染阻塞资源——浏览器必须等待 CSS 下载并解析完成后才能渲染页面。
| 阶段 | 说明 | 优化目标 |
|---|---|---|
| 下载 CSS | 从服务器获取样式文件 | 减少文件大小 |
| 解析 CSS | 构建 CSSOM | 简化选择器 |
| 渲染阻塞 | 等待 CSSOM 完成 | 减少阻塞时间 |
关键 CSS 提取
什么是关键 CSS
关键 CSS 是首屏渲染所必需的最小样式集合。将其内联到 HTML 中可以消除额外的网络请求。
<!DOCTYPE html>
<html>
<head>
<!-- 关键 CSS 内联 -->
<style>
/* 首屏必需的样式 */
body { margin: 0; font-family: system-ui; }
.header { height: 60px; background: #333; }
.hero { padding: 40px; background: #f5f5f5; }
</style>
<!-- 非关键 CSS 异步加载 -->
<link rel="preload" href="/css/main.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/css/main.css"></noscript>
</head>
自动提取工具
使用工具自动提取关键 CSS:
// 使用 critical 库
const critical = require('critical')
critical.generate({
base: 'dist/',
src: 'index.html',
target: 'index-critical.html',
width: 1300,
height: 900,
inline: true
})
关键说明: 关键 CSS 的提取需要指定视口尺寸,通常按桌面和移动端分别生成。
异步加载非关键 CSS
使用 media 属性
<!-- 打印样式不阻塞渲染 -->
<link rel="stylesheet" href="/css/print.css" media="print">
<!-- 其他非关键样式 -->
<link rel="stylesheet" href="/css/below-fold.css" media="print" onload="this.media='all'">
使用 JavaScript 动态加载
function loadCSS(href) {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = href
document.head.appendChild(link)
}
// 页面加载后加载非关键样式
window.addEventListener('load', () => {
loadCSS('/css/animations.css')
loadCSS('/css/below-fold.css')
})
CSS 文件优化
移除未使用的 CSS
// 使用 PurgeCSS
// postcss.config.js
module.exports = {
plugins: [
require('@fullhuman/postcss-purgecss')({
content: ['./src/**/*.html', './src/**/*.vue'],
defaultExtractor: content => content.match(/[\w-/:]+(?<!:)/g) || []
})
]
}
压缩与合并
// vite.config.js
export default {
build: {
cssMinify: true,
cssCodeSplit: true // 按需分割 CSS
}
}
选择器优化
避免复杂选择器
/* ❌ 低效 - 浏览器从右向左匹配 */
.header .nav ul li a.active { }
/* ✅ 高效 - 单一类名 */
.nav-link-active { }
减少层级
/* ❌ 过深嵌套 */
.page .content .article .section .paragraph { }
/* ✅ 扁平化 */
.article-paragraph { }
现代 CSS 特性优化
CSS 容器查询
/* 减少 JavaScript 响应式逻辑 */
@container sidebar (min-width: 300px) {
.widget {
display: grid;
grid-template-columns: 1fr 1fr;
}
}
CSS 变量减少重复
:root {
--primary-color: #3498db;
--spacing-unit: 8px;
}
.button {
background: var(--primary-color);
padding: calc(var(--spacing-unit) * 2);
}
构建时优化
Vite CSS 配置
// vite.config.js
export default {
css: {
devSourcemap: true,
preprocessorOptions: {
scss: {
additionalData: '@import "./src/styles/variables.scss";'
}
}
},
build: {
rollupOptions: {
output: {
assetFileNames: 'css/[name]-[hash].css'
}
}
}
}
监控与测试
使用 Lighthouse 检测关键 CSS 问题:
| 审计项 | 目标 |
|---|---|
| 消除阻塞渲染的资源 | 0 个阻塞资源 |
| 未使用的 CSS | 小于 10KB |
| 首次内容绘制 (FCP) | 小于 1.8s |
最佳实践
- 内联关键 CSS:首屏样式直接写入 HTML
- 异步加载:非关键样式在页面加载后加载
- 移除无用样式:使用 PurgeCSS 等工具
- 压缩输出:开启 CSS 压缩
- 监控性能:定期检查 CSS 对加载的影响
正确优化 CSS 关键路径可以显著改善首屏渲染时间,提升用户体验。


