全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 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
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码