Tailwind插件必须显式注册到config的plugins数组,否则类名不生成;自定义插件须用tailwindcss/plugin封装,theme()仅在插件函数内有效;扩展禁用属性如text-shadow应通过theme.extend配置而非社区插件。

tailwind.config.js 的 plugins 数组必须显式注册插件
装了插件包但类名没生成,八成是漏写了 plugins 配置。Tailwind 不会自动扫描 node_modules 里的插件,必须手动引入并放进 plugins 数组里。
常见错误包括:
- 只运行
npm install -D @tailwindcss/forms,却没在tailwind.config.js中加require('@tailwindcss/forms') - 用
import语法但项目没设"type": "module",导致require报错;此时应改用.cjs后缀或换回 CommonJS - 本地插件路径写错,比如
require('./plugins/my-plugin')却没这个文件,构建会直接崩溃
自定义插件必须用 tailwindcss/plugin 包一层
直接 module.exports = { '.my-class': { ... } } 是无效的——Tailwind 根本不识别纯对象。插件函数必须由 tailwindcss/plugin 创建上下文,才能安全调用 addUtilities、theme 等方法。
正确结构示例:
立即学习“前端免费学习笔记(深入)”;
const plugin = require('tailwindcss/plugin')
module.exports = plugin(function({ addUtilities, theme }) {
addUtilities({
'.text-gradient': {
background: `linear-gradient(90deg, ${theme('colors.blue.500')}, ${theme('colors.purple.500')})`,
'-webkit-background-clip': 'text',
'-webkit-text-fill-color': 'transparent'
}
})
})
注意:theme() 只能在该函数体内调用,外部访问会报 theme is not a function;如果要用带斜杠的类名(如 .aspect-16/9),得解构 e 并显式调用 e('16/9')。
扩展 text-shadow 这类默认禁用的属性,优先走 theme.extend
Tailwind 默认不生成 text-shadow 工具类,不是 bug,是设计取舍。想用它,最稳妥的方式是在 tailwind.config.js 的 theme.extend.textShadow 下声明值,而不是找社区插件。
别装 @tailwindcss/text-shadow —— 它已归档、不维护,和 v3.3+ 冲突,装了会导致构建失败。
正确配置示例:
theme: {
extend: {
textShadow: {
sm: '0 1px 2px rgba(0, 0, 0, 0.1)',
DEFAULT: '0 2px 4px rgba(0, 0, 0, 0.2)',
none: 'none'
}
}
}
这样就能用 text-shadow-sm、text-shadow-none,响应式前缀如 md:text-shadow-lg 也生效。注意:类名中的 sm 指阴影尺寸,和文字大小无关;多个阴影不能靠组合类实现,得自己写内联 style 或用 matchUtilities 做动态解析。
addUtilities 和 matchUtilities 的分工不能乱
静态工具类(如 .rotate-135、.bg-gradient-to-r)用 addUtilities;带参数的动态类(如 fluid-text-[clamp(1rem,2vw,1.5rem)])必须用 matchUtilities,否则无法解析括号内值。
容易踩的坑:
- 把媒体查询写进样式值里,比如
{ '@media': { ... } }—— 必须作为独立键:'@media (min-width: 768px)': { '.md\:foo': { ... } } - 深色模式要手动加
'.dark .dark\:foo',不能依赖嵌套写法 -
addComponents是给组件类(如.btn)用的,混进工具类逻辑会导致覆盖优先级错乱
真正难的不是写插件,而是判断该用 theme.extend、addUtilities 还是 matchUtilities —— 错一个,生成的类就不可用,而且没报错,只默默失效。


















