关键CSS必须内联以避免渲染阻塞;应提取首屏必需样式(≤10KB)内联至head,用critters等工具生成临界CSS;合并CSS需注意顺序、去@import、防重复;PurgeCSS需配置content路径与safelist白名单。

CSS 文件体积过大、数量过多,确实会拖慢 HTML5 页面的首屏加载和渲染速度——尤其是阻塞渲染的关键 CSS 资源,浏览器必须解析完它才能开始绘制页面。
关键 CSS 为什么必须内联?
浏览器遇到 时,默认会阻塞渲染,直到该 CSS 下载并解析完成。哪怕只有一小段样式控制首屏按钮颜色或布局,若放在外部文件里,用户就可能看到白屏或内容闪动。
- 仅把首屏(above-the-fold)必需的 CSS 提取出来,用
内联到中 - 避免内联整个
main.css:体积超过 ~10KB 就可能触发移动端网络重排或延迟解析 -
工具推荐:
critters(Webpack 插件)、penthouse(生成临界 CSS)、或 Vite 的vite-plugin-critical
多个 CSS 文件怎么合并才不翻车?
不是简单 cat 拼接就行。顺序错、重复声明、媒体查询失效、@import 嵌套过深,都会导致样式丢失或覆盖异常。
- 确保合并后
@media规则位置不变,否则响应式断点可能失效 - 移除所有
@import:它们在 CSS 中是同步阻塞的,比更慢 - 用 PostCSS +
postcss-import替代手工 import,并开启inline: true展开依赖 - 检查合并后是否有重复
body { margin: 0 }类声明——CSSOM 构建时会保留最后一条,但维护性极差
如何判断哪些 CSS 真的“用不上”?
靠人工删太危险;靠覆盖率报告(如 Chrome DevTools 的 Coverage tab)又容易漏掉 JS 动态插入的 class 或伪类状态(:hover、:focus-within)。
立即学习“前端免费学习笔记(深入)”;
- 打开 DevTools → More Tools → Coverage → 刷新页面 → 查看未使用字节占比(注意:仅反映当前交互路径)
- 对组件级项目,优先用
unused-css或purgecss扫描 HTML/JS 模板中的 class 名,再匹配 CSS 选择器 -
警惕:含
[data-theme="dark"]、.is-open、.js-loaded这类运行时 class 的规则,需显式配置白名单,否则会被误删 - PurgeCSS 配置中务必包含
content: ["./src/**/*.html", "./src/**/*.js"],否则找不到动态 class
module.exports = {
content: ["./src/**/*.html", "./src/**/*.js"],
safelist: [/^is-/, /^data-theme/, /hover:/, /focus:/],
defaultExtractor: content => content.match(/[\w-/:]+(?
真正影响性能的往往不是 CSS 总量,而是「浏览器必须等哪部分」和「是否触发重排重绘」。压缩、Gzip、HTTP/2 多路复用能缓解传输问题,但解决不了关键路径阻塞——所以优化重点永远在加载时机与作用域上。











