前言:起名的痛苦,只有写 CSS 的人懂

上一篇咱们把打包工具换成了 Vite,项目启动是快了,但写起代码来,心里还是有个疙瘩。

尤其是写样式的时候。你是不是经常遇到这种场景:
对着一个 <div> 发呆 30 秒,只是为了给它起个类名。
wrapper?不行,外面已经有一个了。
container?太泛了。
user-profile-card-inner-text-box?写完自己都觉得啰嗦。

好不容易起好了名字,你要在 .tsx.css 文件之间来回切。左边写个 className,右边写具体样式。写着写着,你就不记得右边那个 display: flex 到底有没有生效,又得切回浏览器看。

这就是我们被 BEM(Block Element Modifier)命名法折磨的日常。

今天,我们要聊聊 Tailwind CSS。我知道,很多人第一次看它代码的时候,反应跟我当年一样:“这不就是行内样式(Inline Styles)吗?这代码乱得能看?”

但奇怪的是,凡是硬着头皮用了它一周的人,最后都成了它的死忠粉。咱们来聊聊这到底是为什么。
在这里插入图片描述


第一阶段:抗拒 —— “这一坨 class 是什么玩意?”

让我们直面恐惧。当你第一次看到 Tailwind 的代码时,它确实长得很丑:

<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  Button
</button>

传统的 CSS 卫道士(包括曾经的我)会立刻跳出来说:

  1. 违背了“关注点分离” :HTML 就该管结构,CSS 就该管样式,你把它们混在一起简直是大逆不道。
  2. 可读性极差:一眼望去全是缩写,根本不知道这标签是干嘛的。

于是,大多数人还没 npm install,就被这种“视觉污染”劝退了。


第二阶段:尝试 —— 居然不用切文件了?

但是,如果你忍着恶心试着写了一个页面,你会发现一种久违的流畅感。

以前你的工作流是这样的:

  1. 在 JSX 里写 <div className="chat-notification">
  2. 打开 CSS 文件。
  3. .chat-notification { display: flex; align-items: center; ... }
  4. 发现需要微调间距,回到 JSX 看结构,再回 CSS 改数值。

而在 Tailwind 里:

  1. <div className="flex items-center gap-4 p-6 bg-white shadow-lg">
  2. 完事了。

你不需要离开当前的 HTML 标签。你的手不需要离开键盘去摸鼠标切文件。这种**“原子化”**的类名,就像是积木块,你心里想的是“我要个 Flex 布局,垂直居中,加点阴影”,手下打出来的就是 flex items-center shadow-lg

这种“所想即所得”的反馈回路,比传统 CSS 快了不止一倍。 这里的快,不是指代码运行快,而是指你的大脑不用在“起名字”和“切文件”这两个毫无意义的动作上空耗 CPU。


第三阶段:领悟 —— 它是约束,不是放纵

很多人误解 Tailwind 是“随便写”。其实恰恰相反,Tailwind 最大的价值在于设计约束(Design System)

在传统 CSS 里,你可能会随手写个 margin: 13px,过一会忘了,又写个 margin: 15px。导致整个网站的间距忽大忽小,看着不精致。

但在 Tailwind 里,你没有 13px 这种选项。 你只能选 m-4 (16px) 或者 m-3 (12px)。 颜色也是一样,你只能用 text-gray-500 或者 text-gray-600,而不是随手吸一个 #8a8a8a

这种强制性的约束,保证了全站的视觉一致性。你不需要是一个专业的设计师,只要老老实实套用 Tailwind 的色板和间距表,做出来的页面通常都不会太丑。


第四阶段:维护 —— 敢删代码才是好代码

这是我彻底爱上 Tailwind 的决定性瞬间。

在老项目里维护 CSS 是地狱。当你删掉一个 HTML 节点时,你敢删对应的 CSS 类吗? 你不敢。因为你不知道这个 .btn-primary 是不是还在别的地方用到了。 久而久之,CSS 文件变成了“只增不减”的垃圾场,谁也不敢动。

但是 Tailwind 的样式是跟着 HTML 走的。 你把这个 <button> 删了,它身上的 bg-blue-500 也就跟着消失了。 没有死代码(Dead Code)。

这种安全感,对于维护一个长期迭代的项目来说,简直是无价之宝。


避坑与建议:别走火入魔

当然,Tailwind 也有被滥用的时候。这里有两条老司机的建议:

1. 别在 HTML 里拼长城 如果一串 class 长得像老太太的裹脚布,确实很难看。这时候你要配合组件化(Component)思维。 别到处复制粘贴那几十个 class,把它封装成一个 <Button> 组件。 这样你的代码里只有清爽的 <Button>,脏活累活都藏在组件内部了。

2. 善用 clsxtailwind-merge 当你需要根据状态动态切换样式时,千万别搞字符串拼接。用 clsx 这种库会让代码优雅很多:

<div className={clsx(
  "flex items-center p-4",
  isActive ? "bg-blue-100 text-blue-600" : "text-gray-500"
)}>

总结

Tailwind CSS 一开始确实像个异类,它挑战了我们十几年的开发习惯。 但 CSS 的本质是为了高效地构建界面,而不是为了为了遵守某种“教条”。

当你习惯了这种不再纠结类名、不再频繁切文件、不再担心样式冲突的开发体验后,你真的回不去写 BEM 了。

所以,别光看文档吐槽了,找个周末的小项目试一下。说不定下周一,你也会变成那个到处安利“真香”的人。

好了,我要去把那个刚接手的项目里的 style.css 给重构了,祝大家的样式永远不冲突。
在这里插入图片描述


下期预告:UI 画好了,逻辑写通了,但你的数据流是不是还是一团乱麻? 各种 props 传得满天飞,useEffect 互相打架? 下一篇,我们来聊聊 “React 状态管理的终极奥义:Server State vs Client State” ,帮你彻底理清 React Query 和 Context 的边界。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐