content路径必须用绝对路径,不能写../packages;须用path.resolve(__dirname, '..')生成稳定路径,每个子包单独维护tailwind.config.js,并显式列出所有文件后缀与跨包路径。

content路径必须用绝对路径,不能写../packages
Tailwind 在 Monorepo 中静默失效,90% 是因为 content 里写了相对路径。它解析时永远以 process.cwd()(你执行 pnpm dev 的目录)为基准,不是以 tailwind.config.js 文件位置为准。你在 apps/web/tailwind.config.js 里写 "../packages/ui/src/**/*.{ts,tsx}",但若从根目录运行命令,.. 就指向了错误层级。
必须用 path.resolve(__dirname, '..') 构造绝对路径:__dirname 始终指向当前配置文件所在目录,完全不受执行位置影响。
- 在
tailwind.config.js开头加const path = require('path'); - 每条
content条目都用path.resolve(__dirname, '../packages/ui/src/**/*.{ts,tsx}')写 - 每个子包(如
apps/admin、packages/ui)应各自维护一份tailwind.config.js,不要共用根目录配置 - 如果某个包用的是
lib目录而非src,路径必须同步改成lib/**/*.{js,jsx,ts,tsx}
Vue/React/Svelte 文件后缀必须显式列出
Tailwind 不会自动推断你用了什么扩展名。漏写 .vue,整个 SFC 模板里的 class="text-lg flex" 就不会被提取;漏写 .svelte,SvelteKit 组件同样失效。
常见错误是只写 "./src/**/*.{js,ts,jsx,tsx}",结果 Vue 或 Svelte 组件类名全丢。
立即学习“前端免费学习笔记(深入)”;
- Vue 项目必须加
.vue:例如path.resolve(__dirname, './src/**/*.{vue,js,ts,jsx,tsx}') - Svelte 项目必须加
.svelte:例如path.resolve(__dirname, './src/**/*.{svelte,js,ts}') - Astro、MDX、Lit 等同理,
.astro、.mdx、.ts(Lit 模板常写在 TS 字符串里)都要显式列出来 - 通配符
**不保证覆盖所有嵌套层级,如有src/pages或src/layouts,建议单独加一行明确路径
跨包路径不能靠通配符,必须逐条写死
"./packages/**/src/**/*.{ts,tsx}" 这种写法在 Tailwind v3/v4 中不可靠——它的 glob 解析器(基于 fast-glob)不支持嵌套通配符匹配,可能只扫到第一层子目录,漏掉 packages/button/src 或 packages/card/src。
Monorepo 中没有“智能扫描”,只有“你写哪条,它扫哪条”。
- 必须显式列出每个需扫描的包路径,哪怕有 10 个也要逐条写
- 路径层级必须与
pnpm-workspace.yaml实际结构严格匹配,多一层或少一层..,Tailwind 就静默跳过,不报错也不警告 - 如果用了 pnpm workspace 协议,确保该包已通过
pnpm add -D workspace:tailwind-config安装,且配置文件里用require("tailwind-config")加载(不能用import) - UnoCSS / Windi CSS 同样卡在这一步,它们默认只扫描当前工作区目录,对
packages/ui这类被引用但不在当前apps/web目录下的源码,根本不会触达
动态类名(如 class="text-${size}-sm")必须进 safelist
Tailwind 只认源码中完整、静态、无插值的类名字符串。class="text-${size}-sm" 和 :class="'text-' + size + '-sm'" 全部无效——构建时看不到完整类名,就不会生成对应 CSS 规则。
现象是 DOM 上 class 属性显示正常(如 text-lg-sm),但开发者工具查不到规则。
- 预定义映射更可控:比如
const sizeClasses = { sm: 'text-sm', lg: 'text-lg' },然后用className={sizeClasses[size]} - 用
safelist:在tailwind.config.js中写safelist: ['text-sm', 'text-lg', /^text-[a-z]+$/] - 注意正则必须用斜杠包裹(
/^text-[a-z]+$/),写成字符串('/^text-[a-z]+$/')就无效 - 如果类名含数字或连字符(如
text-2xl、bg-red-500),正则得写成/^text-[\d]+xl$|^bg-red-\d+$/,否则匹配不上
content 路径是否绝对、后缀是否全量、跨包路径是否逐条写死。


















