tailwind css jit 模式未触发更新,主因是 content 路径未覆盖文件、tailwind_mode=watch 未启用、构建工具未透传变更事件、动态 class 未加入 safelist,或配置修改后未重启服务。

Tailwind CSS JIT 模式没触发更新,基本可以断定它压根没“看到”你改的文件——不是编译慢,是根本没进 JIT 流水线。
content 路径没覆盖 HTML 或组件文件
JIT 是静态扫描器,只读 content 数组里明确写的路径。漏一个文件,那个文件里的 class 就彻底不生成 CSS。
-
content必须是数组,不能是字符串:["./src/**/*.{js,jsx,ts,tsx}", "./public/index.html"]✅;"./src/**/*.tsx"❌ - Vue 项目要加
.vue后缀:./src/**/*.{js,ts,vue} - Next.js app 目录必须显式包含:
./app/**/*.{js,ts,jsx,tsx,html} - public/index.html 这类静态入口常被忽略,但里面写的
class(比如dark:变体)也得扫到
TAILWIND_MODE=watch 没生效
JIT 在开发时默认不监听 HTML 文件变更,必须靠这个环境变量激活 watch 链路,否则保存 HTML 就像没动过。
- 启动命令里加:
"dev": "TAILWIND_MODE=watch vite"(非 Windows)或"dev": "cross-env TAILWIND_MODE=watch vite"(Windows) - 终端运行后必须出现
Using JIT (Just-In-Time) mode,且带watching for changes提示 - 这个变量只对开发服务器有效,生产构建自动忽略
构建工具没把变更事件传给 Tailwind
Tailwind 不自己监听文件系统,全靠 Vite / Webpack / Next.js 把变更推过来。中间任一环节断掉,JIT 就收不到信号。
- Vite 项目:别用
@import引入 Tailwind CSS,该写法绕过 HMR 追踪;确保css.preprocess没被禁用 - Create React App + CRACO:检查
craco.config.js是否将tailwindcss正确注入 PostCSS 插件,并保留原始规则处理逻辑 - Next.js:删掉根目录手写的
postcss.config.js——它会覆盖框架内置配置,禁用 JIT 自动路径推导
HTML 里用了动态 class 拼接
JIT 不执行 JS,只读字符串字面量。模板字符串拼接的 class(如 class={`p-${size}-4`})在扫描阶段就是个未知模式,直接跳过。
- 这类写法不会报错,但对应组合类(如
p-sm-4)根本不会出现在最终 CSS 中 - 若必须动态,用
safelist显式声明:safelist: [/p-[a-z]+-4/, 'p-sm-4', 'p-lg-4'] - 注意正则斜杠不能少:
/p-[a-z]+-4/✅,p-[a-z]+-4❌
最常被忽略的是:改了 tailwind.config.js 后不重启 dev server,缓存还在跑旧配置;还有容器环境里 inotify 默认不可用,得加 --poll 或设 TAILWIND_POLL=true。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











