说说 React 中引入 CSS 的方式有哪几种?区别?
一、是什么
在 React 项目中,样式管理是一个重要的工程化话题。与传统的 HTML 开发不同,React 组件化的架构要求样式方案也能与组件模型良好配合,实现样式的封装、复用和维护。
目前主流的 CSS 引入方式包括:内联样式、CSS 文件导入、CSS Modules、CSS-in-JS 以及原子化 CSS(Tailwind CSS)。每种方案在作用域隔离、开发体验、性能、SSR 支持等维度各有取舍。
二、内联样式(Inline Styles)
React 支持通过 style 属性直接编写样式,属性值是一个 JavaScript 对象,属性名使用 camelCase:
动态样式是内联样式的优势场景:
局限性:
- 不支持伪类(
:hover、:focus)、伪元素(::before)、媒体查询 - 不支持动画
@keyframes - 无法利用浏览器的样式缓存优化
- 样式优先级最高,难以被覆盖
三、CSS 文件导入
将样式写在 .css 文件中,通过 import 引入。这是最传统的方式:
问题:
- 全局作用域,类名可能冲突
- 需要通过 BEM 等命名规范手动避免冲突
- 删除组件后样式可能遗留
四、CSS Modules
CSS Modules 通过构建工具自动将类名转换为唯一的哈希值,实现样式的局部作用域:
编译后类名类似 Button_primary_x3f2a,天然避免冲突。配合 clsx 或 classnames 库可简化类名拼接:
五、CSS-in-JS
CSS-in-JS 将样式逻辑和组件逻辑写在同一个文件中,通过 JavaScript 动态生成样式。
styled-components
Emotion
零运行时方案
传统 CSS-in-JS 存在运行时性能开销。新一代零运行时方案在编译阶段将样式提取为静态 CSS:
六、Tailwind CSS(原子化 CSS)
Tailwind CSS 采用原子化的工具类方式编写样式,每个类只做一件事:
动态样式处理:
配合 tailwind-merge 和 clsx 处理样式覆盖:
七、对比总结
八、最佳实践建议
- 小型项目 / 组件库:CSS Modules 或 Tailwind CSS
- 大型应用:Tailwind CSS + CSS Modules(混合使用)
- 需要高度动态样式:CSS-in-JS(推荐零运行时方案如 vanilla-extract)
- 设计系统:styled-components / Emotion + 主题系统
- SSR 项目(Next.js):Tailwind CSS 或 CSS Modules(避免传统 CSS-in-JS 的 SSR 复杂性)
在实际项目中,可以组合使用多种方案:
九、总结
React 中的 CSS 方案没有银弹,每种方式都是在作用域隔离、开发体验、性能和灵活性之间做取舍。近年来 Tailwind CSS 在社区中快速增长,成为很多新项目的首选。CSS Modules 作为稳定成熟的方案仍然广泛使用。CSS-in-JS 正在向零运行时方向演进。选择时应综合考虑团队熟悉度、项目规模、SSR 需求和性能要求。