前端工程化 词条目录
前端Wiki/前端工程化/进阶/CSS 工程化方案

CSS in JS 与方案选型

CSS in JS(styled-components、emotion)把样式写进 JS:以组件为单位,样式天然局部、可复用、可读 props 动态变化,彻底告别命名与覆盖问题。它是组件化框架(React)生态的自然产物。

缺点也明显:运行时有性能开销(产物变大)、样式与逻辑耦合、SSR 需要额外处理。近两年零运行时方案(如 vanilla-extract、Linaria)把 CSS in JS 编译成静态 CSS,兼得两者优点。

  • 优点:局部作用域、随 props 动态变化、跟组件走,删除组件即删除样式
  • 缺点:运行时方案有性能成本, unlink 样式与组件耦合,调试看到的是哈希类名
  • 选型口诀:Vue/传统项目用 Sass 或 Modules;React 中后台可 styled;追性能用零运行时方案
React
// styled-components 写法(React)
import styled from 'styled-components';

// 样式跟着组件走,props 直接驱动样式
const Button = styled.button\`
  padding: 8px 16px;
  border-radius: 6px;
  border: none;
  background: \${props => props.primary ? '#a371f7' : '#e5e7eb'};
  color: \${props => props.primary ? '#fff' : '#333'};
  cursor: pointer;

  &:hover { opacity: 0.85; }
\`;

// 使用:<Button primary>主要按钮</Button>
//       <Button>次要按钮</Button>

// 对比同功能的 Sass Modules:需要 .scss 文件 + class 拼接
//  选型没有银弹:看框架、看团队、看是否需要动态样式
本节要点CSS in JS 样式随组件、可动态,但有运行时成本;零运行时方案是进化方向。
🔗 相关词条ReactCSSVue