React 项目里样式选择特别容易演变成“技术偏好之争”:有人喜欢 CSS Modules,有人坚持 CSS-in-JS,有人推 Tailwind,有人全站直接上组件库。可真正成熟的判断,从来不是先问哪种方案更潮,而是先看项目要解决什么问题:
- 样式隔离;
- 团队协作;
- 设计一致性;
- 主题扩展;
- 组件复用;
- 长期维护成本。
为什么样式方案本质上是工程选择?
因为 React 本身并不强绑定某一种样式体系,这既是自由,也是复杂度来源。样式方案一旦选定,就会持续影响:
- 组件的可读性;
- 主题和令牌治理;
- 设计系统演进;
- 页面之间的一致性;
- 后续迁移和重构成本。
所以样式选择绝不是“写起来顺手就好”,而是工程体系的一部分。
CSS Modules 真正适合什么?
CSS Modules 的价值在于:
- 局部类名隔离;
- 保留相对直接的 CSS 书写方式;
- 不强迫你把样式逻辑嵌进 JS;
- 对很多中后台和业务系统来说足够稳。
它更适合那些:
- 组件样式范围相对清晰;
- 团队希望样式和逻辑适度分离;
- 项目不想引入更重的样式运行时心智。
它的局限在于,如果设计令牌和组件体系本身没有建立好,仅靠 Modules 并不会自动带来一致性。
CSS-in-JS 为什么会有人很喜欢,也有人很抗拒?
因为它最大的特点就是把样式表达更深地和组件逻辑耦合在一起。优势通常体现在:
- 更自然地做动态样式;
- 某些主题和组件变体表达更顺;
- 与组件封装思路协同更紧。
但代价也很明确:
- 运行时和构建时心智更重;
- 阅读时样式和逻辑更缠;
- 团队风格不统一时容易失控。
所以它是否适合,关键要看团队是否真的需要这种表达方式,而不是它看起来“更组件化”。
Tailwind 在 React 项目里真正解决了什么?
Tailwind 的核心收益,在于:
- 让常见样式组合更快表达;
- 用工具类逼近统一设计语言;
- 减少很多命名和样式散落的问题。
它尤其适合:
- 设计系统边界比较明确;
- 组件样式变化较多但仍希望保持一致;
- 团队愿意接受 utility-first 的阅读方式。
但它也不是没有代价。类名堆叠过多时,可读性和语义层次会下降;如果缺少设计令牌和组件抽象,页面仍然可能写得很散。
组件库为什么不能简单理解成“直接拿来用”?
组件库当然能明显提高效率,尤其在中后台系统里价值很高。但组件库真正进入项目后,你仍然要回答:
- 组件库和设计体系是否一致;
- 二次封装做到哪一层;
- 按钮、表格、表单、弹窗这些高频结构是否要沉成业务壳层;
- 主题、权限、国际化等能力如何协同。
如果完全把页面能力绑死在组件库原始 API 上,后续业务一致性和设计扩展都会受限。
样式方案和设计系统为什么必须一起看?
因为样式方案负责“怎么写”,设计系统负责“写什么规则”。很多项目的真正问题不是选错工具,而是:
- 没有统一颜色、间距、字号层级;
- 同类组件视觉规则不一致;
- 主题切换无抓手;
- 页面写出来“都能用”,但不像同一个系统。
这说明样式选择如果不和设计令牌、组件变体、业务壳层一起看,讨论很容易只停留在写法层。
放回项目里,真正重要的判断顺序是什么?
一个更稳的顺序通常是:
1. 先确认项目需要的是局部隔离、动态样式、工具类协作,还是组件库加速;2. 再评估团队现有习惯和维护成本;3. 样式方案确定后,尽快把令牌和组件规则沉下来;4. 页面不要长期直接面对所有原始样式能力;5. 统一性通常比“局部写起来最爽”更重要。
最常见的几个误区
1. 只谈方案优缺点,不谈项目和团队约束
这种讨论很容易失真。
2. 组件库直接裸用到底
后期业务一致性会明显变差。
3. 样式方案选了,却没有设计令牌和统一规则
最后依然会发散。
4. 为了技术喜好频繁切换样式体系
长期维护成本会很高。
总结
React 样式系统与设计组件的核心,不是选一个最潮方案,而是建立一套能长期协作的视觉与组件基础设施。CSS Modules、CSS-in-JS、Tailwind 和组件库各自解决的问题不同,真正重要的是它们是否和团队习惯、设计系统、业务壳层和长期维护目标相匹配。只要你先看项目需要什么,再看方案能承接什么,样式体系就会稳很多。