伟大的 CSS 摆钟:超越 Tailwind 并重新发现平台

多年来,前端领域一直由“实用优先”(utility-first)哲学主导,其中 Tailwind CSS 处于领先地位。通过提供一套全面的低级实用类,Tailwind 承诺解决命名难题以及对“不断增长的全局 CSS 文件”的恐惧。然而,越来越多的开发者开始感觉到摆钟正在回摆。

最近资深工程师之间的讨论提出了一个反复出现的主题:虽然实用框架可以加速初始开发,但它们可能会产生认知债务,阻碍长期可维护性,并从根本上改变开发者与 Web 平台交互的方式。从 Tailwind 转向其他方式并不一定是对效率的拒绝,而是对语义化 HTML 和现代 CSS 力量的重新发现。

反对实用优先的理由:“Div Soup”与语义衰退

对实用优先框架最尖锐的批评之一是,它们颠倒了 Web 开发的自然顺序。传统上,HTML 定义文档的意义(语义),而 CSS 定义其表现

正如社区成员所指出的,Tailwind 经常将开发者推向“CSS 优先”的方法。开发者不再问“这个元素是什么?”(例如,一个 <nav>、一个 <article> 或一个 <main>),而是发现自己经常在问“我需要哪些类来让它看起来正确?”这往往会导致创建不必要的包装元素——即臭名昭著的“div soup”——仅仅是为了给样式类提供一个挂载点。

"Tailwind 的最大问题在于它颠倒了你应该思考 HTML 和 CSS 的顺序……Tailwind 反而将开发者推向一种 CSS 优先的方法。你会思考你想要的 Tailwind 类,然后仅仅为了有一个元素来挂载你的类,就在 DOM 中扔进另一个 div。"

这种转变不仅影响代码的外观;它还影响可访问性。当 HTML 仅仅成为样式类的载体时,依赖屏幕阅读器和其他辅助技术的语义结构可能会被忽视。此外,由此产生的 HTML 膨胀可能会使代码库难以阅读和推理,特别是当组件变成“巨大的、臃肿的类堆”时。

“技能差距”论点

有一种反复出现的情绪,即实用框架可以充当拐杖,阻碍开发者掌握底层平台。当工具通过预定义的 API 处理间距、颜色和网格逻辑时,学习 CSS 级联、Flexbox 或 Grid 的细微差别就失去了动力。

批评者认为,这会导致一代开发者习惯于使用 flex items-center justify-between,但在没有框架的情况下,难以编写自定义媒体查询或管理复杂的布局。这创造了一种依赖关系,即开发者的技能与特定工具的语法绑定在一起,而不是可以迁移的 CSS 知识。

辩护:设计系统与开发速度

尽管存在批评,但 Tailwind 的流行并非偶然。支持者认为它不仅仅是一个 CSS 框架,而是一个编撰的设计系统。通过限制选择(例如,使用特定的间距比例或颜色调色板),它消除了与选择任意像素值相关的“决策疲劳”。

支持者提到的关键优势包括:

  • 生产优化: 构建过程确保只有在项目中实际使用的 CSS 会被发送到客户端,从而实现高度优化的包。
  • 消除命名疲劳: CSS 最乏味的部分之一是发明像 .card-inner-wrapper-v2 这样的名称。Tailwind 完全消除了这一要求。
  • 一致性: 它确保开发团队使用相同的设计语言,从而在不同模块之间实现和谐的 UI。

寻找中间地带

随着辩论的演变,许多开发者正在寻求一种能够兼顾两者的混合方法。目前已出现几种策略:

1. 作用域 CSS 与组件

Svelte、Vue 和 Angular 等框架默认提供作用域样式。这解决了“全局命名空间冲突”问题——这也是许多人转向 Tailwind 的主要原因——而无需牺牲编写标准 CSS 的能力。通过将样式保持在组件局部,开发者可以维护整洁的 HTML 结构,同时避免全局 CSS 泄漏的风险。

2. @apply 指令

对于那些想要 Tailwind 的设计令牌(design tokens)但讨厌 HTML 污染的人来说,@apply 指令允许开发者将实用类移动到 CSS 文件中。这保持了 HTML 的语义化,同时利用了 Tailwind 的预定义比例。

3. 现代 CSS 原语

随着 CSS 变量(Custom Properties)的出现,对沉重的实用框架的需求已经减少。像 Open Props 这样的库提供了一套 CSS 变量,提供了设计系统的约束力,而没有实用框架的专有语法。

AI 因素

有趣的是,LLM 的兴起为这场讨论增添了新的维度。有人认为 AI 实际上更擅长编写 Tailwind,因为这些类是标准化的,并且存在于海量的训练数据中。其他人则认为 AI 使原生 CSS 变得可行,因为它能够处理编写样板代码的“费力部分”,让开发者能够人专注于高层架构和语义。

结论:摆钟回摆

无论一个人更喜欢 Tailwind 的效率,还是更喜欢语义化 CSS 的纯粹性,核心教训是工具应该为开发者服务,而不是反过来。向原生 CSS 回归的趋势提醒我们,Web 平台本身非常强大,而掌握其原语——HTML 和 CSS——仍然是开发者可以做出的最具前瞻性的投资。

Sources