讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

css如何通过CSS-in-JS管理样式_将CSS与JavaScript结合使用

浅强姑娘_8066

浅强姑娘_8066

发布时间:2026-02-10 11:48:02

|

650人浏览过

|

来源于php中文网

原创

CSS-in-JS易出问题因内联样式不支持伪类、媒体查询等;真正方案需运行时生成唯一class并注入style标签;styled-components与emotion在SSR、主题、TS支持及性能上各有侧重。

css如何通过css-in-js管理样式_将css与javascript结合使用

为什么直接在JS里写CSS容易出问题

CSS-in-JS不是简单地把style对象塞进React.createElement或style属性里。那样只是内联样式(inline style),不支持伪类、媒体查询、全局作用域复用,也无法利用CSS的层叠和继承机制。

常见错误现象包括:

  • :hover、::before 完全失效
  • 响应式断点只能靠JS监听window.innerWidth手动切换class
  • 同一组样式在多个组件中复制粘贴,改一处漏十处
  • 样式污染:一个组件的.button意外覆盖了另一个组件的同名class

真正可用的CSS-in-JS方案,核心是运行时生成唯一class名 + 注入真实<style></style>标签,而不是拼字符串或只靠style属性。

styled-components 和 emotion 的关键区别在哪

两者都通过模板字符串解析CSS并注入<style></style>,但底层行为不同:

立即学习“Java免费学习笔记(深入)”;

  • styled-components 默认启用服务端渲染(SSR)兼容模式,会为每个组件生成带哈希的class(如 sc-bdVaJa),且支持withConfig控制是否启用css prop
  • @emotion/react 更轻量,css函数返回的是class名字符串,可直接用于className;styled API行为类似,但支持更灵活的主题透传(比如用useTheme读取嵌套theme值)

使用场景差异:

  • 如果项目已用create-react-app且不想配Babel插件,优先选styled-components(开箱即用)
  • 如果需要细粒度控制样式注入时机(比如只在某个模块加载后才注入),@emotion/react的cache配置更直接
  • emotion对TypeScript的类型提示更完善,尤其是css函数的属性自动补全

性能影响:两者都会做样式去重,但styled-components在严格模式下会对props做深比较,可能引发不必要的重渲染;emotion默认浅比较,更可控。

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载

如何避免CSS-in-JS导致的重复注入和内存泄漏

这不是理论风险,而是真实发生过的线上问题:同一个组件被多次动态导入(比如React.lazy + Suspense),每次加载都重新执行styled.div,导致相同样式被反复插入<style></style>标签。

关键对策:

  • 确保styled.xxx定义写在模块顶层,不要放在组件函数体内或useEffect里
  • 使用babel-plugin-styled-components(对应styled-components)或@emotion/babel-plugin,开启pure模式,让Babel在编译期剥离无副作用的样式定义
  • 在服务端渲染时,统一用ServerStyleSheet(styled-components)或CacheProvider + renderStylesToString(emotion)收集所有样式,避免客户端重复计算

一个典型错误写法:

function MyButton() {
  const StyledDiv = styled.div`color: red`; // ❌ 每次渲染都新建,class名不复用
  return <StyledDiv>Click</StyledDiv>;
}

要不要用 vanilla-extract 或 Linaria 替代 runtime 方案

vanilla-extract和Linaria属于zero-runtime CSS-in-JS,它们在构建时(build time)就把JS中的样式提取成真实CSS文件,最终产物里没有样式解析逻辑。

适用条件很明确:

  • 项目用Vite或Webpack 5+,能接入自定义loader(vanilla-extract需@vanilla-extract/webpack-plugin)
  • 不依赖运行时主题切换(比如暗色模式需JS控制)、不依赖组件props动态生成样式(如color={props.variant === 'danger' ? 'red' : 'blue'})
  • 团队接受额外的学习成本:要写export const sprinkles = createSprinkles(...)而不是直接写styled.div

容易被忽略的一点:这些方案无法支持基于DOM状态的样式,比如input:focus + label或div:has(> p),因为它们不操作真实DOM,也不生成运行时选择器逻辑。

真正的复杂点不在“怎么写”,而在于样式生命周期是否与组件一致——runtime方案天然绑定,build-time方案必须靠约定和工具链兜底。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

332

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

540

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

411

2026.03.13

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

326

2026.06.03

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

738

2026.06.16

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2418

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1898

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3104

2023.09.04

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn