CSS-in-JS vs 传统CSS:现代样式方案选择指南

链表断了
2025-12-13 21:40
阅读 732

大家好,我是小林,一名211高校的计算机专业研究生。平时喜欢在 GitHub 和掘金上写技术博客,帮助刚入门前端的同学少走弯路。今天这篇教程的起因是上周有位学弟问我:“面试官问我在项目里用的是 CSS-in-JS 还是传统 CSS,我完全懵了。”这让我想起自己当初学的时候也是一头雾水——明明都是写样式,为啥还有这么多“流派”?

其实,CSS-in-JS传统 CSS 是两种主流的前端样式管理方式,它们各有优劣,适用于不同场景。无论你是准备找工作(面试题常客!),还是想搞个个人网站、甚至写个爬虫页面美化一下,了解它们都非常重要。这篇文章我会用最通俗的语言 + 实操代码,带你从零搞懂怎么选、怎么用。


一、先搞清楚:什么是 CSS-in-JS?什么是传统 CSS?

传统 CSS(Classic CSS)

就是你最早学的那种写法:

  • 把样式写在 .css 文件里
  • <link> 引入 HTML
  • 通过 classid 绑定到元素上
<!-- 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 依赖。


六、学习建议与避坑指南

新手路线图

  1. 先掌握传统 CSS:包括选择器、盒模型、Flex/Grid 布局。这是地基!
  2. 理解 CSS 模块化痛点:比如 BEM 命名规范、CSS Modules。
  3. 再学 CSS-in-JS:从 styled-components 开始,理解“样式即函数”的思想。
  4. 扩展阅读: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

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝