CSS-in-JS vs 传统CSS:现代样式方案选择指南
大家好,我是小林,一名211高校的计算机专业研究生。平时喜欢在 GitHub 和掘金上写技术博客,帮助刚入门前端的同学少走弯路。今天这篇教程的起因是上周有位学弟问我:“面试官问我在项目里用的是 CSS-in-JS 还是传统 CSS,我完全懵了。”这让我想起自己当初学的时候也是一头雾水——明明都是写样式,为啥还有这么多“流派”?
其实,CSS-in-JS 和 传统 CSS 是两种主流的前端样式管理方式,它们各有优劣,适用于不同场景。无论你是准备找工作(面试题常客!),还是想搞个个人网站、甚至写个爬虫页面美化一下,了解它们都非常重要。这篇文章我会用最通俗的语言 + 实操代码,带你从零搞懂怎么选、怎么用。
一、先搞清楚:什么是 CSS-in-JS?什么是传统 CSS?
传统 CSS(Classic CSS)
就是你最早学的那种写法:
- 把样式写在
.css文件里 - 用
<link>引入 HTML - 通过
class或id绑定到元素上
<!-- index.html -->
<div class="header">欢迎来到我的网站</div>
/* style.css */
.header {
color: blue;
font-size: 24px;
}
优点:简单直观,浏览器原生支持。
缺点:全局作用域,容易样式冲突;难以按组件拆分。
我当初写第一个 React 项目时,两个组件都用了
.button,结果一个变红一个变蓝,互相覆盖,调试到凌晨……
CSS-in-JS(样式写在 JavaScript 里)
顾名思义,把 CSS 写在 JavaScript 文件中,通常配合 React 使用。最流行的库是 styled-components。
// Header.jsx
import styled from 'styled-components';
const StyledHeader = styled.div`
color: blue;
font-size: 24px;
`;
export default function Header() {
return <StyledHeader>欢迎来到我的网站</StyledHeader>;
}
优点:
- 自动作用域隔离(每个组件样式独立)
- 支持 JS 动态逻辑(比如根据 props 改颜色)
- 无需管理 class 名
缺点:需要额外依赖;对纯 HTML 项目不友好。
二、环境准备:快速搭建开发环境
我们以 React 项目为例(因为 CSS-in-JS 主要在 React 生态流行)。如果你还没装 Node.js,请先去 nodejs.org 下载 LTS 版本。
步骤 1:创建 React 项目
npx create-react-app css-compare-demo
cd css-compare-demo
npm start
访问 http://localhost:3000 看到 React 默认页面就算成功!
步骤 2:安装 CSS-in-JS 库(以 styled-components 为例)
npm install styled-components
提示:如果你只想用传统 CSS,这步跳过即可。Create React App 已内置 CSS 支持。
三、核心概念对比:一张表说清楚
| 对比维度 | 传统 CSS | CSS-in-JS (styled-components) |
|---|---|---|
| 作用域 | 全局(容易冲突) | 局部(自动隔离) |
| 动态样式 | 需要手动切换 class | 直接用 JS 变量/props 控制 |
| 文件组织 | .css 文件 |
样式和组件写在一起(JSX 文件内) |
| 性能 | 浏览器原生解析,快 | 运行时生成 CSS,略慢(但可接受) |
| 调试 | DevTools 直接看 class | 自动生成唯一 class 名,稍难读 |
| 适用场景 | 静态页面、简单项目 | 组件化强的 SPA(如 React/Vue) |
| 是否需要构建工具 | 否(但现代项目一般都有) | 是(需 Babel/Webpack 支持) |
📌 关键理解:CSS-in-JS 的核心思想是“样式即组件”,它把样式当作组件的一部分来管理,而不是独立资源。
四、实战项目:做一个主题切换按钮
我们用两种方式分别实现一个按钮,点击后切换深色/浅色主题。你会立刻感受到差异!
方案 1:传统 CSS 实现
步骤 1:创建 CSS 文件
/* src/components/ButtonTraditional.css */
.button {
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.button.light {
background-color: white;
color: black;
}
.button.dark {
background-color: #333;
color: white;
}
步骤 2:编写 React 组件
// src/components/ButtonTraditional.jsx
import './ButtonTraditional.css';
import { useState } from 'react';
export default function ButtonTraditional() {
const [isDark, setIsDark] = useState(false);
return (
<button
className={`button ${isDark ? 'dark' : 'light'}`}
onClick={() => setIsDark(!isDark)}
>
切换主题(传统 CSS)
</button>
);
}
问题:如果其他组件也定义了 .button,就可能冲突!
方案 2:CSS-in-JS 实现(styled-components)
// src/components/ButtonStyled.jsx
import styled from 'styled-components';
import { useState } from 'react';
const StyledButton = styled.button`
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
background-color: ${props => props.isDark ? '#333' : 'white'};
color: ${props => props.isDark ? 'white' : 'black'};
`;
export default function ButtonStyled() {
const [isDark, setIsDark] = useState(false);
return (
<StyledButton
isDark={isDark}
onClick={() => setIsDark(!isDark)}
>
切换主题(CSS-in-JS)
</StyledButton>
);
}
优势:
- 样式完全封装,不怕冲突
- 直接用
props.isDark控制颜色,逻辑清晰 - 不用手动拼接 class 字符串
💡 小技巧:styled-components 会自动生成唯一的 class 名(如
.sc-gtsrHT),你完全不用关心命名!
五、常见问题解答(新手必看!)
Q1:CSS-in-JS 会影响性能吗?
答:在绝大多数应用中,影响微乎其微。虽然它在运行时生成 CSS,但现代库(如 styled-components v6)已高度优化。除非你做的是超高性能要求的可视化大屏或游戏,否则放心用。
Q2:我能不能在同一个项目里混用两种方式?
答:完全可以! 很多团队采用“混合策略”:
- 全局样式(如 reset.css、字体)用传统 CSS
- 组件内部样式用 CSS-in-JS
Q3:面试官为什么爱问这个问题?
答:因为它考察你对工程化思维的理解。面试题常问:
- “你们项目为什么选 CSS-in-JS?”
- “如何解决 CSS 全局污染问题?”
- “动态主题怎么实现?”
掌握原理+能说出适用场景,就能拿高分!
Q4:爬虫项目需要考虑这个吗?
答:如果你只是用 Puppeteer 或 Playwright 做数据抓取(爬虫),样式基本无关紧要。但如果你的爬虫要截图或渲染完整页面(比如生成报告),那样式方案会影响最终视觉效果。此时传统 CSS 更稳定,因为 CSS-in-JS 依赖 JS 执行,而某些爬虫环境可能禁用 JS。
✅ 综合建议:爬虫项目若需美化页面,优先用传统 CSS + 内联样式,减少 JS 依赖。
六、学习建议与避坑指南
新手路线图
- 先掌握传统 CSS:包括选择器、盒模型、Flex/Grid 布局。这是地基!
- 理解 CSS 模块化痛点:比如 BEM 命名规范、CSS Modules。
- 再学 CSS-in-JS:从 styled-components 开始,理解“样式即函数”的思想。
- 扩展阅读:Tailwind CSS(另一种现代方案)、CSS Modules、Sass。
避坑提醒
- ❌ 不要一上来就用 CSS-in-JS!先搞懂 CSS 本身。
- ✅ 在小型静态页(如博客、文档站)用传统 CSS 更轻量。
- ✅ 在大型 React 应用(如后台系统、SaaS 产品)优先考虑 CSS-in-JS。
- 🔧 调试技巧:用浏览器 DevTools 的 "Computed" 面板看最终样式,别被自动生成的 class 名吓到。
我的学习资源推荐
- MDN Web Docs - CSS 教程(免费权威)
- styled-components 官方文档(有中文)
- 《CSS 权威指南》(书籍,适合深入)
- LeetCode / CodePen 上找布局练习题
结语
回到开头那个面试题:“你用 CSS-in-JS 还是传统 CSS?”
现在你可以自信回答:
“根据项目需求选择。如果是组件化强的 React 应用,我会用 styled-components 实现样式隔离和动态主题;如果是静态页面或需要 SEO 的内容站,传统 CSS 更合适。在最近的项目中,我采用了混合方案……”
技术没有银弹,只有合适的工具用在合适的场景。希望这篇指南能帮你理清思路,不再被“样式方案”绕晕。如果你觉得有帮助,欢迎点赞收藏,也欢迎在评论区提问——我当初也是这么一步步过来的,深知新人的困惑。
下期预告:《从零实现一个简易爬虫:用 Puppeteer 抓取动态网页》,敬请期待!
作者:小林(211 CS 研究生 | 技术博主)
字数:约 3200 字
适用人群:前端零基础、准备面试、想搞懂现代样式方案的同学

评论 0