原文地址:https://medium.com/full-stack-forge/stop-using-tailwind-like-a-beginner-heres-how-pros-do-it-4d2b6c712fa7
原文作者: Daniel Scott
去年,我打开了一个客户的代码库,发现里面有一个按钮组件,它的 className 里硬生生塞了 27 个 Tailwind 类。
那场景,就像是有人把一袋拼字游戏的字母随手一摇,然后全倒进了代码编辑器里。
更离谱的是什么?
整个应用里的每一个按钮,都有一套自己“稍微不一样”的混乱样式版本。不同深浅的蓝色,随心所欲的内边距,圆角大小仿佛是靠掷飞镖决定的。
就在那一刻我意识到:大多数开发者并不是在用 Tailwind,而是在滥用它。
这也不能全怪他们。Tailwind 让你编写内联实用类变得太容易了,以至于很多人会忘记,你原本应该是在构建一个可维护的系统。在前端框架/工程化的实践中,CSS的管理和复用是关键一环。
所以,是时候纠正一下了。
1. 停止编写“Utility 小说”
是的,Tailwind 是 utility-first(实用优先)。但这不代表你需要在每个组件里写一部 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 指令,或者在 JavaScript 里借助 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">Click Me</button>
更干净、更可复用。未来的你一定会感谢现在这个做出改变的你。
2. Design Token 不是摆设
如果你的间距、字体大小、颜色全都零散地写在各个 utility class 里,那你根本没有发挥出 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" />
3. 用 Variants,不要 Copy-Paste
Tailwind 提供了 @variants 指令,社区也有像 tailwind-variants、cva 这类库,这都是有原因的。
如果你在每一个错误提示组件里都手动复制 bg-red-500 text-white,那你可能做错了。你需要的是组件样式的单一事实来源(single source of truth),而不是一堆远处看起来好像遵循了 DRY(Don‘t Repeat Yourself)原则,走近一看全是意大利面条式的重复代码。
4. 响应式和状态类不是随手撒的调料
初学者写的 Tailwind 代码,经常像是把 md:、lg:、hover: 这些前缀当作调料随便乱撒。没有规划,也缺乏一致性。
专业开发者是用设计系统的思维在编写代码:思考在每个断点下,哪些属性会变化?哪些交互状态是真正重要的?你的响应式 class 应该是在有逻辑地讲述一个适配故事,而不是突然插入一段让人摸不着头脑的“反转剧情”。
不好的示例:
<p className="text-sm md:text-lg lg:text-base hover:underline hover:opacity-70 focus:text-xl">
Hello
</p>
更好的示例:
<p className="text-sm md:text-lg hover:underline focus:opacity-70">
Hello
</p>
5. 不要和 Tailwind 对抗 —— 去配置它
如果你发现自己在为一些 Tailwind 本来就能轻松处理的事情编写大量自定义 CSS,那很可能是因为你还没有充分配置它。
想要特定的网格布局?把它加到配置文件里。需要自定义动画?Tailwind 支持定义 keyframes。不想每次都手动输入 rounded-xl?把它设置成默认的圆角值。
记住,Tailwind 是一个高度可定制的框架,而不仅仅是一桶预设好的实用类。请把它当作一个强大的框架来使用和配置。
最后
Tailwind CSS 非常强大,但前提是你得有意识、有方法地去使用它。如果你的代码库看起来像一锅乱炖的“utility 汤”,那它既不“干净”,也不“现代”——它只是一个穿着时尚外衣的维护噩梦。
整理你的类名,善用配置文件,抽离可复用的模式,用系统化的思维去编写样式。这是因为:
- 在初学者手中,Tailwind 可能是快速交付“能用但丑陋”代码的捷径。
- 在专业开发者手中,经过良好设计和管理的 Tailwind,才是构建可维护系统的真正超能力。