Emotion在高性能场景下优于Styled-components,因其样式注入更轻量(单style标签)、缓存更激进(两级缓存)、SSR提取更精准(基于渲染树)。

styled-components 和 emotion 这类库在动态样式引入中确实更直接、更安全,不是因为“写法更酷”,而是它们把样式逻辑和组件生命周期真正绑定了。
props 驱动的样式变更无需手动 class 切换
传统 CSS 方案里,你得靠 className 拼接、条件判断、甚至 useEffect 去 toggle class;而 styled-components 的模板字符串可以直接消费 props:
`background: ${props => props.primary ? '#007bff' : '#6c757d'};`
- props 更新时,样式自动 recompute,无需额外触发 DOM class 变更
- 没有 class 名冲突风险 —— 生成的类名是哈希化的,比如
sc-bdnHyK - 类型系统(如 TypeScript)能校验 props 是否存在、类型是否匹配,避免运行时拼写错误
主题切换不依赖全局 CSS 变量或重载样式表
用 ThemeProvider + useTheme,主题值可穿透到任意嵌套的 styled 组件内部:
const Button = styled.button`
color: ${props => props.theme.text};
background: ${props => props.theme.background};
`;
- 主题对象是 JS 对象,可直接参与运算(比如
lighten(theme.primary, 0.2)) - 主题变更时,所有依赖它的组件样式自动更新,不需手动监听或广播事件
- 服务端渲染时也能同步注入主题相关 CSS,避免 FOUC
状态组合爆炸时,CSS-in-JS 更易维护
一个按钮可能有 primary/secondary + disabled + loading + size 四个维度,共 2×2×2×3 = 24 种组合。手写 CSS 类名容易漏、难查、难测试。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
-
styled内部用函数式逻辑组合,比如disabled && loading ? 'cursor: not-allowed' : '' - 样式逻辑和组件逻辑在同一文件,调试时不用跳转到另一个 CSS 文件找对应规则
- 单元测试可直接断言最终生成的 CSS 字符串(
jest-emotion或@testing-library/react配合快照)
注意:动态性不等于无约束
过度依赖 runtime 计算样式会拖慢首次渲染,尤其在列表项多、样式复杂时。实际项目中要留意:
立即学习“前端免费学习笔记(深入)”;
- 避免在
styled内部调用高开销函数(如深 clone、正则匹配) - 不要把整个 theme 对象传进样式函数 —— 只取需要的字段,减少闭包引用
- SSR 场景下,确保服务端和客户端生成的哈希类名一致(需配置
cache或stylisPlugins)
emotion 的 css 函数和 styled 的缓存机制比纯 className + useState 组合更可控。

















