全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-16 8 分钟 ✍️ juanwangdev

关键 CSS 提取

关键渲染路径优化:提取首屏必需 CSS,内联到 HTML,其余 CSS 异步加载。

问题背景

HTML
<!-- 传统方式阻塞渲染 -->
<link rel="stylesheet" href="app.css">  <!-- 阻塞渲染直到加载完成 -->

大 CSS 文件会阻塞首屏渲染,用户看到白屏。

优化方案

步骤一:提取关键 CSS

识别首屏可见内容所需的样式。

HTML
<!DOCTYPE html>
<html>
<head>
  <!-- 内联关键 CSS -->
  <style>
    /* 首屏必需样式 */
    .header { height: 60px; background: #fff; }
    .hero { min-height: 400px; }
    .nav { display: flex; }
    /* 仅包含首屏可见元素 */
  </style>
</head>

步骤二:异步加载非关键 CSS

HTML
<!-- 方式一:preload + onload 切换 -->
<link rel="preload" href="app.css" as="style" onload="this.rel='stylesheet'">

<!-- 方式二:media 属性欺骗 -->
<link rel="stylesheet" href="app.css" media="print" onload="this.media='all'">

<!-- 方式三:动态加载 -->
<script>
  const link = document.createElement('link');
  link.rel = 'stylesheet';
  link.href = 'app.css';
  document.head.appendChild(link);
</script>

工具实现

Critical

Bash
npm install -g critical

# 提取关键 CSS
critical src/index.html --base src/ --inline > dist/index.html

PurgeCSS(按需剔除)

JavaScript
// purgecss.config.js
module.exports = {
  content: ['./src/**/*.html', './src/**/*.js'],
  css: ['./src/**/*.css'],
  output: './dist/css/'
};

Webpack 插件

JavaScript
// webpack.config.js
const Critters = require('critters-webpack-plugin');

module.exports = {
  plugins: [
    new Critters({
      preload: 'swap',
      pruneSource: false
    })
  ]
};

内联大小控制

内联大小影响
< 14KB最佳,TCP 慢启动范围内
14-50KB可接受,权衡取舍
> 50KB过大,考虑进一步拆分

关键 CSS 内联大小建议控制在 14KB 以内。

验证效果

Chrome DevTools → Lighthouse:

  • First Contentful Paint (FCP)
  • Largest Contentful Paint (LCP)

优化前后对比:

text
优化前 FCP: 2.5s
优化后 FCP: 0.8s

要点总结

  • 提取首屏必需 CSS 内联到 HTML
  • 非关键 CSS 异步加载,避免阻塞渲染
  • 使用 Critical、PurgeCSS 等工具自动化处理
  • 内联 CSS 控制在 14KB 以内最佳
  • 通过 Lighthouse 验证优化效果

📝 发现内容有误?点击此处直接编辑

← 上一篇 使用 will-change
下一篇 → 图片优化与 CSS Sprites
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库