去年翻开同事的代码,看到一个按钮组件的className
里塞了27个Tailwind类名。
就像有人把字母汤倒进了VSCode里。
更要命的是什么?
整个项目里每个按钮都有自己独特的"混乱风格"——不同深浅的蓝色、随机的内边距、像是掷飞镖算出来的圆角半径。
那一刻我意识到:大部分开发者不是在"使用"Tailwind,而是在"糟蹋"它。
这不能怪他们。Tailwind让写内联工具类变得如此简单,以至于我们忘记了自己本来应该构建的是可维护的代码。
让我们来解决这个问题。
是的,Tailwind是工具优先的。
但这不意味着你需要在每个组件里写出14个类名的史诗巨作。
如果你的div
长这样:
<div className="bg-blue-500 text-white p-4 rounded-lg shadow-lg hover:bg-blue-600 transition duration-300 ease-in-out flex items-center justify-center gap-2 w-full max-w-sm mx-auto border border-blue-700" />
恭喜,你成功让代码审查者哭了。
专业做法:通过CSS中的@apply
或JS中的clsx
/classnames
将重复模式提取为组件类。
/* button.css */
.btn-primary {
@apply bg-blue-500 text-white p-4 rounded-lg shadow-lg
hover:bg-blue-600 transition duration-300 ease-in-out;
}
现在你的JSX看起来是这样:
<button className="btn-primary">点击我</button>
更简洁。可复用。未来的你会感谢现在的你。
如果你的间距、字体大小或颜色都是在随机工具类中硬编码的,那你就没有利用好Tailwind的配置文件。
你完全可以在tailwind.config.js
中定义品牌颜色、间距比例和排版。
为什么要这么做?
因为当品牌团队决定你的"主要"蓝色应该深3%时,你不会需要在93个组件中寻找并修改bg-blue-500
。
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
brand: {
primary: '#1e40af',
secondary: '#f59e0b',
}
}
}
}
}
然后这样使用:
<div className="bg-brand-primary text-brand-secondary" />
Tailwind有@variants
,还有像tailwind-variants
或cva
这样的库是有原因的。
如果你在每个错误消息中都复制粘贴bg-red-500
,那你就做错了。
你需要的是组件样式的唯一真实来源,而不是一个只是远看起来DRY的意大利面条式混乱。
初学者的Tailwind代码通常看起来像有人随意撒上md:
、lg:
和hover:
类,就像撒调料一样。
没有计划。没有一致性。
专业人士用设计系统的思维思考:每个断点处什么发生变化?哪些状态真正重要?
你的响应式类应该讲述一个故事,而不是情节转折。
糟糕的做法:
<p className="text-sm md:text-lg lg:text-base hover:underline hover:opacity-70 focus:text-xl">你好</p>
更好的做法:
<p className="text-sm md:text-lg hover:underline focus:opacity-70">你好</p>
如果你发现自己在为Tailwind本可以做的事情编写自定义CSS,那可能是你没有充分配置它。
想要特定的网格布局?添加到配置中。
需要自定义动画?Tailwind支持关键帧。
厌倦了到处输入rounded-xl
?让它成为默认值。
Tailwind是一个框架,不是一桶工具类。把它当框架来对待。
Tailwind很强大,但只有当你有意识地使用它时才是如此。
如果你的代码库看起来像工具汤,那它不是"干净"或"现代"的——它是一个穿着漂亮外衣的未来维护噩梦。
整理你的类。使用配置。提取模式。系统化思考。
因为在初学者手中的Tailwind是快速交付丑陋但功能性代码的方式。
在专业人士手中的Tailwind?那才是超能力。
你是否也曾写过Tailwind"工具类小说"?
还是你已经传道配置福音好多年了?
在评论区分享你的恐怖故事、胜利经验和犀利观点吧。让我们看看谁才是真正的Tailwind高手。