真正有效的CSS精简需结合静态分析与上下文裁剪,而非仅删注释空格;核心手段包括用PurgeCSS删除未使用规则、谨慎配置cssnano、拆分CSS按需加载,并清理第三方库冗余样式。
手动删除注释、空格、换行看似能减小体积,但现代 CSS 文件里真正占空间的往往是重复规则、未使用的选择器、冗余的厂商前缀,以及大量为兼容旧浏览器保留的渐进增强代码。单纯格式化压缩(如 cssnano 的默认 preset)通常只能再压 10%–20%,而真正有效的精简必须结合构建时的静态分析与上下文裁剪。
purgecss 删除未使用的 CSS 规则这是目前最实用的精简手段,尤其适合使用 Tailwind、Bootstrap 或组件化框架(Vue/React)的项目。它通过扫描 HTML、JS、Vue、TSX 等源文件,提取所有出现过的类名,再反向过滤掉 CSS 中未被引用的选择器。
className={`btn-${type}`} 中的 type 值无法被静态分析捕获,需显式配置 whitelist 或 content 模式glob 指定内容路径:purgecss: {
content: ['./src/**/*.{html,js,jsx,ts,tsx,vue}']
}vite-plugin-purgecss,但注意 Vite 4.3+ 内置了 rollup-plugin-visualizer,先查清哪些包真正贡献了体积cssnano 的关键配置别用默认 preset默认的 cssnano preset(default)会启用全部优化,但其中 autoprefixer 和 postcss-discard-comments 可能掩盖真实问题;更危险的是 postcss-merge-longhand 在某些 Flex/Grid 场景下会破坏渲染。
{
preset: ['default',
{
discardComments: { removeAll: true },
mergeLonghand: false,
autoprefixer: { overrideBrowserslist: ['> 1%', 'last 2 versions'] }
}]
}purgecss,可禁用 cssnano 的 discardUnused,避免重复分析data: URL,cssnano 默认不压缩,需额外加 postcss-inline-svg
压缩单个 500KB 的 main.css 不如把它拆成 base.css(重置、工具类)、components.css(按钮、卡片)、pages/home.css(仅首页用)。首屏只加载 base.css + 关键页面样式,其余异步注入。
mini-css-extract-plugin 配合 splitChunks 按模块路径分离:splitChunks: {
cacheGroups: {
styles: { name: 'styles', test: /\.(css|vue)$/, chunks: 'all', enforce: true }
}
}loadable-components 或 @loadable/server 实现服务端样式提取extractCritical SSR