根本原因是 content 字段配置错误导致 jit 模式失效,从而输出超 2mb 全量 css;需确保路径无误、扩展名齐全、覆盖所有模板与动态场景,并通过生产构建验证扫描效果。

根本原因不是 Tailwind 本身臃肿,而是 content 字段没配对、没配全,导致 JIT 模式失效,最终输出接近全量的 CSS(常超 2MB)。
content 路径漏配或写错,JIT 就不工作
Tailwind v3+ 完全依赖 content 数组做静态扫描;路径错一个字符、少一种扩展名,它就“看不见”你写的 class。
-
content: ["src/**/*.{js,ts}"]→ 漏了.jsx和.tsx,所有 Vue/React 组件里的class或className全被忽略 -
content: ["./src/**/*.{js,jsx,ts,tsx}"]→ 带./前缀,在 Vite/Next.js 中可能被跳过,统一用src/**/*.{js,jsx,ts,tsx,vue,html} - Vue3 项目只写了
src/**/*.vue却漏了src/**/*.{js,ts}→ Composition API 里写的class字符串(比如useAttrs().class或defineProps注释)不会被识别 - 用了 MDX、EJS 或服务端模板(如
views/**/*.html.ejs)但没加进content→ SSR 渲染出的 class 不在扫描范围内,JIT 只能保守保留全部
动态类名没兜底,上线就丢样式
JIT 不执行 JS,只匹配源码中出现的字面量字符串。像 class={`${base} ${isActive ? 'text-blue-500' : 'text-gray-400'}` 这种写法,只要两个字符串真实出现在某个被 content 扫到的文件里,就不会丢;但一旦漏扫,或者用了变量拼接(如 text-${color}-500),这些类直接进回收站。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 优先改用
@apply封装语义类(如.btn-primary),再把该 CSS 文件路径加进content - 必须用动态拼接时,在
tailwind.config.js的safelist里写精确正则:/^text-(red|blue|green)-500$/,结尾加$防误匹配 - 避免
/^text-/这种宽泛正则,它会保住全部text-类,等于放弃 tree-shaking -
md:text-lg和text-lg是两个独立类,safelist里只写后者,前者仍会被删
没走生产构建,验证全是假象
开发服务器是 JIT 实时生成,完全不依赖 content 扫描结果;而 npm run build 才真正触发 Purge 流程。本地 npm run dev 正常 ≠ 生产正常。
- 强制走生产流程验证:
TAILWIND_MODE=build npx tailwindcss -i ./src/input.css -o ./dist/output.css --minify - 人工注入冷门但合法类,比如在某个被
content覆盖的文件里加class="bg-hotpink" - 构建后运行
grep -o "bg-hotpink" ./dist/output.css:非空说明 JIT 没跑,还在全量打包;为空说明扫描已启动 - 再用
grep -o "text-lg" ./dist/output.css | wc -l对比源码中出现次数,显著减少(比如 120→8)才是真生效
最常被忽略的是:本地开发时开 hot reload,CSS 是按需注入的,根本没走 purge 流程。体积数字只看生产构建产物,别信 dev server 控制台。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










