为什么我不再相信 Tailwind?三个月重构项目教会我的事

Tailwind 曾经是我最爱的工具,直到它让我维护不下去整个项目。


前情提要:我是如何变成 Tailwind 重度用户的

作为一个多年写 CSS 的前端,我曾经深陷"命名地狱":

什么 .container-title, .btn-primary, .form-item-error,一个项目下来能写几百个类名,然后改样式时不知道该去哪动刀,甚至删个类都心慌。

直到我遇见了 Tailwind CSS------一切原子化,想改样式就加 class,别管名字叫什么,直接调属性即可。

于是我彻底拥抱它,团队项目里我把所有 SCSS 全部清除,组件中也只保留了 Tailwind class,一切都干净、轻便、高效。

但故事从这里开始转变。


三个月后的重构期,我被 Tailwind"反噬"

我们的后台管理系统迎来一次大版本升级,我负责重构 UI 样式逻辑,目标是:

  • 统一设计规范;
  • 提高代码可维护性;
  • 降低多人协作时的样式冲突。

刚开始我信心满满,毕竟 Tailwind 提供了:

  • 原子化 class;
  • @apply 合成组件级 class;
  • 配置主题色/字体/间距系统;
  • 插件支持动画/form 控件/typography;

但随着项目深入,我开始发现 几个巨大的问题,并最终决定停用 Tailwind。


一、class 污染:结构和样式纠缠成灾

来看一个真实例子:

scss 复制代码
<div class="flex items-center justify-between bg-white p-4 rounded-lg shadow-sm border border-gray-200">
  <h2 class="text-lg font-semibold text-gray-800">订单信息</h2>
  <button class="text-sm px-2 py-1 bg-blue-500 text-white rounded hover:bg-blue-600">编辑</button>
</div>

你能看出这个组件的"设计意图"吗?

你能快速改它的样式吗?

一个看似简单的按钮,一眼看不到设计语言,只看到一坨 class,你根本不知道:

  • px-2 py-1 是从哪里决定的?
  • bg-blue-500 是哪个品牌色?
  • hover:bg-blue-600 是统一交互吗?

Tailwind 让样式变得快,但也让样式"变得不可读"。


二、复用失败:想复用样式还得靠 SCSS

我天真地以为 @apply 能帮我合成组件级样式,比如:

less 复制代码
.btn-primary {
  @apply text-white bg-blue-500 px-4 py-2 rounded;
}

但问题来了:

  • @apply 不能用在媒体查询内
  • @apply 不支持复杂嵌套、hover/focus 的组合;
  • 响应式伪类 写在 HTML 里更乱,如:lg:hover:bg-blue-700
  • 没法动态拼接 class,逻辑和样式混在组件逻辑层了

最终结果就是:复用失败、样式重复、维护困难。


三、设计规范无法沉淀

我们设计系统中定义了若干基础变量:

  • 主色:#0052D9
  • 次色:#A0AEC0
  • 字体尺寸规范:12/14/16/18/20/24/32px
  • 组件间距:8/16/24

本来我们希望 Tailwind 的 theme.extend 能承载这套设计系统,结果发现:

  • tailwind.config.js 修改后,需要全员重启 dev server
  • 新增设计 token 非常繁琐,不如直接写 SCSS 变量;
  • 多人改配置时容易冲突;
  • 和设计稿同步代价高。

这让我明白:配置式设计系统不适合快速演进的产品团队。


四、多人协作混乱:Tailwind 并不直观

当我招了一位新同事,给他一个组件代码时,他的第一句话是:

"兄弟,这些 class 是从设计稿复制的吗?"

他根本看不懂 gap-6, text-gray-700, tracking-wide 分别是什么意思,只看到一堆"魔法 class"

更糟糕的是,每个人心中对 text-smtext-base 的视觉认知不同,导致多个组件在微调时出现样式不一致、间距不统一的问题。

Tailwind 的语义脱离了设计意图,协作就失去了基础。


最终决定:我切回了 SCSS + BEM + 设计 token

我们开始回归传统模式:

  • 所有组件都有独立 .scss 文件;
  • 使用 BEM 命名规范:.button, .button--primary, .button--disabled
  • 所有颜色/间距/字体等统一放在 _variables.scss 中;
  • 每个组件样式文件都注释设计规范来源。

这种模式虽然看起来"原始",但它:

  • 清晰分离结构和样式
  • 强制大家遵守设计规范
  • 组件样式可复用,可继承,可重写
  • 新人一眼看懂,不需要会 Tailwind 语法。

总结:Tailwind 不是错,是错用的代价太高

Tailwind 在以下场景表现极好:

  • 个人项目 / 小程序:快速开发、无需复用;
  • 组件库原型:试验颜色、排版效果;
  • 纯前端工程师独立开发的项目:没有协作负担。

但在以下情况,Tailwind 会成为维护灾难:

  • 多人协作;
  • UI 不断迭代,设计语言需频繁调整;
  • 有强复用需求(组件抽象);
  • 与设计系统严格对齐的场景;

我为什么写这篇文章?

不是为了黑 Tailwind,而是为了让你在选择技术栈时更慎重。

就像当年我们争论 Sass vs Less,今天的 Tailwind vs 原子/语义 CSS 并没有标准答案。

Tailwind 很强,但不是所有团队都适合。

也许你正在享受它的爽感,但三个月后你可能会像我一样,把所有 .w-full h-screen text-gray-800 替换成 .layout-container


尾声:如果你非要继续用 Tailwind,我建议你做这几件事

  1. 强制使用 @apply 形成组件级 class,不允许直接使用长串 class;
  2. 抽离公共样式,写在一个统一的组件样式文件中;
  3. 和设计团队对齐 Tailwind 的 spacing/font/color;
  4. 用 tailwind.config.js 做好 token 映射和语义名设计
  5. 每个页面都进行 CSS code review,不然很快就会变垃圾堆。

相关推荐
晴殇i3 分钟前
🌐 CDN跨域原理深度解析:浏览器安全策略的智慧设计
前端·面试·程序员
Uyker28 分钟前
空间利用率提升90%!小程序侧边导航设计与高级交互实现
前端·微信小程序·小程序
bin915337 分钟前
DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_天气预报日历示例(CalendarView01_18)
前端·javascript·vue.js·ecmascript·deepseek
江城开朗的豌豆38 分钟前
JavaScript篇:反柯里化:让函数'反悔'自己的特异功能,回归普通生活!
前端·javascript·面试
江城开朗的豌豆1 小时前
JavaScript篇:数字千分位格式化:从入门到花式炫技
前端·javascript·面试
十年砍柴---小火苗1 小时前
原生js操作元素类名(classList,classList.add...)
javascript·css·css3
henujolly2 小时前
网络资源缓存
前端
yuren_xia5 小时前
Spring Boot中保存前端上传的图片
前端·spring boot·后端
普通网友6 小时前
Web前端常用面试题,九年程序人生 工作总结,Web开发必看
前端·程序人生·职场和发展
站在风口的猪11088 小时前
《前端面试题:CSS对浏览器兼容性》
前端·css·html·css3·html5