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

Prometheus小骑士
2025-06-27 03:53
阅读 237

开篇:什么是CSS与CSS-in-JS?它们能做什么?

开篇:什么是CSS与CSS-in-JS?它们能做什么?

在网页开发中,**CSS(层叠样式表)**就像给网页“穿衣服”的工具。它负责让页面好看、有颜色、有排版。

随着前端技术的发展,一种新的写法出现了——CSS-in-JS。它的核心思想是:把 CSS 写在 JavaScript 文件里。这听起来有点奇怪吧?不过它解决了传统 CSS 的很多痛点,比如样式冲突、难以维护等。

本教程将带你从头开始,了解这两者的区别,并通过一个简单项目来实践,让你明白什么时候用传统CSS、什么时候更适合用CSS-in-JS。


环境准备:搭建你的第一个开发环境

环境准备:搭建你的第一个开发环境

我们要做的是一个简单的按钮组件,使用 React 演示两种方式的实现。所以你需要先安装以下工具:

1. 安装 Node.js 和 npm

  • 前往 https://nodejs.org 下载并安装 LTS 版本
  • 安装完成后,在终端输入:
    node -v
    npm -v
    
    如果显示版本号说明安装成功。

2. 创建 React 项目

我们使用 create-react-app 快速创建项目:

npx create-react-app style-comparison
cd style-comparison
npm start

这样就启动了一个本地服务器,默认会在浏览器打开 http://localhost:3000


核心概念:传统CSS 与 CSS-in-JS 的区别

让我们用最简单的语言解释这两个概念。

传统CSS的特点

  • 分离结构与样式:HTML 负责内容,CSS 负责外观。
  • 全局作用域:同一个类名可能影响多个元素。
  • 依赖文件引入:你得在 HTML 中用 <link> 或 JavaScript 动态导入。

✅ 优点:学习成本低、兼容性好
❌ 缺点:命名冲突多、样式管理难

示例代码

src/App.css 中写一个样式:

.my-button {
  background-color: blue;
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
}

src/App.js 中使用这个类:

import './App.css';

function App() {
  return (
    <button className="my-button">点击我</button>
  );
}

CSS-in-JS 是什么?

CSS-in-JS 不再单独写 CSS 文件,而是直接在 JS 中定义样式对象或字符串,然后通过库自动注入到页面中。

常见的 CSS-in-JS 库包括:

  • styled-components
  • emotion
  • glamorous

✅ 优点:局部作用域、动态样式支持、组件化更方便
❌ 缺点:性能略差、初次学习成本略高

示例代码(使用 styled-components)

安装库:

npm install styled-components

src/App.js 中使用:

import styled from 'styled-components';

const MyButton = styled.button`
  background-color: green;
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
`;

function App() {
  return <MyButton>点击我(CSS-in-JS)</MyButton>;
}

你会看到一个绿色按钮,没有额外引入 CSS 文件!


实战项目:做个切换样式的按钮组件

我们来做一个小项目:显示两个按钮,分别用传统 CSS 和 CSS-in-JS 方式渲染,看看它们的区别。

第一步:创建两个组件文件

src 目录下新建两个文件:

  • TraditionalButton.js
  • StyledButton.js

第二步:传统CSS写法(TraditionalButton.js)

TraditionalButton.js 中写:

import './App.css';

function TraditionalButton() {
  return (
    <button className="traditional-btn">传统按钮</button>
  );
}

export default TraditionalButton;

App.css 中添加样式:

.traditional-btn {
  background: red;
  color: white;
  padding: 10px 20px;
  margin: 10px;
  border: none;
  border-radius: 5px;
}

第三步:CSS-in-JS写法(StyledButton.js)

StyledButton.js 中写:

import styled from 'styled-components';

const StyledBtn = styled.button`
  background: purple;
  color: white;
  padding: 10px 20px;
  margin: 10px;
  border: none;
  border-radius: 5px;
`;

function StyledButton() {
  return <StyledBtn>CSS-in-JS按钮</StyledBtn>;
}

export default StyledButton;

第四步:在App.js中同时展示

修改 App.js

import './App.css';
import TraditionalButton from './TraditionalButton';
import StyledButton from './StyledButton';

function App() {
  return (
    <div style={{ textAlign: 'center', marginTop: 100 }}>
      <h2>传统CSS vs CSS-in-JS</h2>
      <TraditionalButton />
      <StyledButton />
    </div>
  );
}

export default App;

刷新浏览器,你会看到两个不同风格的按钮,分别使用了不同的样式方式!


常见问题:新手容易遇到的问题和解答

Q1:为什么有时候样式没生效?

A:可能是类名拼错了,或者样式被覆盖了。在 CSS-in-JS 中一般不会出现这个问题,因为它默认局部作用域。

Q2:CSS-in-JS 性能会不会很差?

A:大部分情况下影响不大。如果你的项目不大,两者性能差别可以忽略不计。

Q3:怎么判断该用哪个?

A:看团队习惯和项目大小。如果项目大、组件多,推荐使用 CSS-in-JS;如果是静态页面或者个人项目,传统 CSS 更简单。

Q4:CSS-in-JS 是否必须学 React 才能用?

A:不一定。虽然很多 CSS-in-JS 库为 React 设计,但也有支持 Vue、原生 JS 的方案,如 Emotion 支持多种框架。


学习建议:下一步应该学什么?

学完这个入门教程后,你可以继续深入以下几个方向:

✅ 进阶CSS技巧:

  • Flex 布局和 Grid 布局
  • 响应式设计
  • 动画和过渡效果

✅ 掌握更多 CSS-in-JS 工具:

  • Emotion
  • Aphrodite
  • JSS

尝试换一个库重写今天的项目,熟悉不同语法风格。

✅ 组件化思维训练:

学习如何把样式和功能打包成可复用组件,这是现代前端开发的核心能力之一。


小结

在这篇教程中,我们比较了传统CSSCSS-in-JS两种流行的样式编写方式。你学会了:

  • 如何在React中使用传统CSS
  • 如何安装和使用CSS-in-JS库(如styled-components)
  • 实现了一个对比演示项目
  • 解决常见初学者问题
  • 明确下一步学习路线

无论你是想快速开发一个个人网站,还是参与大型企业级应用,掌握这两种方式都非常重要。选择合适的技术,才能事半功倍!

🔚 Happy Coding!

评论 0

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