Emotion 在多数场景下比传统 CSS 文件更快,因其将关键样式内联 HTML 跳过网络请求与解析阻塞,服务端提取最小化 style 块,客户端复用已注入规则且哈希类名天然去重。

Emotion 的渲染性能通常优于传统 CSS 文件,但前提是正确使用 SSR 和缓存机制;直接在浏览器中大量调用 css 函数而忽略哈希复用,反而会拖慢首屏。
为什么 Emotion 在多数场景下比传统 CSS 文件更快?
传统 CSS 文件依赖 <link rel="stylesheet"> 加载,浏览器必须阻塞渲染直到样式表解析完成。Emotion 则把关键样式内联进 HTML(尤其配合 Next.js 或 SSR),跳过网络请求和解析等待。
- 服务端渲染时,
@emotion/server能提取当前页面用到的样式,生成最小化<style>块,避免加载全站 CSS - 客户端 hydration 阶段,Emotion 复用已注入的样式规则,不重复插入 —— 这依赖
cache实例的一致性,跨模块未共享 cache 会导致重复注入 - 哈希类名天然去重:相同对象样式(如
{ color: 'red' })始终生成同一类名,避免冗余规则
哪些操作会让 Emotion 渲染变慢?
不是所有写法都享受性能红利。以下情况会触发运行时样式计算、破坏缓存或引发重复注入:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 在组件内部频繁调用
css且传入非稳定对象(例如每次渲染都新建{ fontSize: props.size + 'px' }) - 未启用
@emotion/babel-plugin,导致本可在编译期生成的静态样式被迫推到运行时 - 多个包各自安装不同版本的
@emotion/cache,造成 cache 实例不共享,样式重复插入 - 在
useEffect或事件回调中动态调用css,绕过 Emotion 的序列化优化路径
传统 CSS 文件真就一定慢?
不一定。当项目已做成熟 CSS 分包 + HTTP/2 推送 + critical CSS 提取时,传统方案的首屏性能可能反超 naïve 使用的 Emotion。
立即学习“前端免费学习笔记(深入)”;
- Webpack 的
MiniCssExtractPlugin可将 CSS 拆为按路由分割的 chunk,实现精准加载 - CSS @layer +
media查询能控制样式生效时机,避免无用规则参与匹配 - 没有 JS 运行时开销:纯 CSS 不消耗主线程,对低端设备更友好
- 但无法实现基于 props 的条件样式(如
color: ${p => p.primary ? 'blue' : 'gray'}),需退化为 class 切换 + 预定义类
真正影响性能的不是“CSS-in-JS”这个标签,而是样式是否被提前确定、是否可复用、是否与渲染生命周期对齐。Emotion 的优势只在你主动管理 cache、启用 Babel 插件、并约束动态逻辑范围时才稳定兑现。


















