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