PurgeCSS 不删除动态生成的 class,只识别源码中静态出现的 class 字符串;需通过 safelist、whitelistPatterns 或 defaultExtractor 处理动态情况,并确保其在 CSS 压缩前执行。
它不解析运行时生成的 class,只扫描源码中**静态出现的字符串**。比如 v-if="show ? 'active' : 'hidden'" 或 classList.add(dynamicClass) 这类动态拼接,PurgeCSS 看不见。
<template> 或 <style scoped> 中以纯文本形式出现class="text-${size}-sm"),得在 content 配置里加 defaultExtractor 或显式列出白名单 whitelistPatterns: [/^text-/, /^bg-/]
<style scoped> 里的 class 会被自动加上属性选择器(如 .btn[data-v-f3f3f]),PurgeCSS 默认能识别;但如果你手动写了 [data-v-xxx] 在 JS 里切换 class,就得把这类属性也加进 extractors
必须让 PurgeCSS 在 CSS 压缩(如 cssnano)之前运行,否则压缩后 class 名被重命名或内联,PurgeCSS 就找不到原始匹配了。
postcss.config.js 里插件顺序:purgecss 必须在 cssnano 之前vite-plugin-purgecss 默认已处理顺序;但若手动配了 build.cssCodeSplit = false,要确认它仍作用于最终合并后的 CSS 字符串@next/bundle-analyzer 验证产物体积,因为 purgecss 可能被 swc CSS 提取逻辑绕过别只看文件大小变化——可能只是压缩率提升。得看实际移除了哪些选择器。
rejected: true 选项(或 CLI 的 --rejected),它会输出被删掉的选择器列表dryRun: true 先试跑,不写入文件,只打印统计:{ "css": "xx KB", "safelist": [], "rejected": 1240 }
icon-home)、JS 控制的动画 class(is-animating)、BEM 的修饰符(btn--large 被当成未使用)——这些都得进 safelist
Tailwind v3+ 内置了 content 配置,本质就是 PurgeCSS 的封装。再额外装 purgecss 插件反而容易冲突。
立即学习“前端免费学习笔记(深入)”;
postcss.config.js 里多余的 purgecss 插件,只留 tailwindcss 和 autoprefixer
tailwind.config.js 的 content 数组覆盖所有模板路径:["./src/**/*.{js,jsx,ts,tsx,vue}"],别漏掉 .mdx 或 .svelte
TAILWIND_MODE=watch npm run dev,避免 purge 干扰热更新safelist 或 whitelistPatterns,这点最容易被跳过——体积数字好看,但页面一交互就丢样式。