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

独立开发路上
2025-06-14 18:37
阅读 387

开篇:什么是 CSS 和 CSS-in-JS?

开篇:什么是 CSS 和 CSS-in-JS?

在网页开发中,HTML 负责结构,JavaScript 负责行为,而 CSS(层叠样式表)负责外观和样式。你可以理解为它是网页的“化妆师”——没有它,页面就像素颜一样单调。

而近几年,一种新的写样式方式逐渐流行起来,叫做 CSS-in-JS。这个名字听起来有点神秘,其实它的核心思想是:用 JavaScript 来定义 CSS 样式

我们为什么要学这个?因为它解决了传统 CSS 的一些痛点,比如:

  • 全局样式容易冲突
  • 难以动态更改样式
  • 组件化开发时难以维护样式作用域

本教程将会带你从头开始认识这两种方式,并通过一个小项目来比较它们的使用体验。


环境准备:搭建你的第一个前端项目

环境准备:搭建你的第一个前端项目

1. 安装 Node.js 和 npm

首先你需要安装 Node.js,它自带了包管理器 npm。安装完成后,在命令行输入:

node -v
npm -v

这两个命令会分别输出 Node.js 和 npm 的版本号,表示安装成功。

2. 创建一个 React 项目

我们将使用 React 来演示 CSS-in-JS 的使用场景(因为 React 社区广泛采用这种技术)。

运行以下命令创建项目:

npx create-react-app css-comparison
cd css-comparison

这样你就有了一个完整的开发环境。接下来可以安装一个常用的 CSS-in-JS 工具库:

npm install styled-components

3. 启动项目

在项目根目录下运行:

npm start

浏览器会自动打开 http://localhost:3000,显示 React 默认首页。

现在你的开发环境就准备好了!


核心概念讲解

核心概念讲解

一、传统 CSS 是如何工作的?

传统 CSS 使用 .css 文件来定义样式,然后通过 <link>import 引入到 HTML 或组件中。

示例代码:

  1. 新建文件 App.css
/* App.css */
.box {
  width: 200px;
  height: 200px;
  background-color: blue;
  color: white;
  text-align: center;
  line-height: 200px;
}
  1. App.js 中引入并使用
// App.js
import './App.css';

function App() {
  return (
    <div className="box">
      Hello CSS!
    </div>
  );
}

export default App;

✅ 运行效果:你会看到一个蓝色正方形框,中间写着 "Hello CSS!"

小贴士:CSS 是通过 class 名称绑定样式的,所以你在 JSX 中必须使用 className 属性而不是 class


二、CSS-in-JS 是什么?

CSS-in-JS 把 CSS 写在 JS 文件里,通常是以字符串模板的形式写入,由专门的库处理这些样式规则。

最流行的工具包括:

  • styled-components
  • emotion
  • linaria

下面以 styled-components 为例,来实现同样的盒子组件。

示例代码:

// App.js
import styled from 'styled-components';

const Box = styled.div`
  width: 200px;
  height: 200px;
  background-color: red;
  color: white;
  text-align: center;
  line-height: 200px;
`;

function App() {
  return <Box>Hello Styled!</Box>;
}

export default App;

✅ 效果:会出现一个红色的正方形框,写着 “Hello Styled!”

✅ 小结:你会发现,你根本不需要 .css 文件了!所有的样式都在 JS 里完成。


三、两种方法对比总结

特性 传统 CSS CSS-in-JS(以 styled-components 为例)
文件结构 独立的 .css 文件 样式直接写在组件代码中
命名冲突 容易冲突 自动命名,避免冲突
动态样式支持 较弱 支持传参,非常灵活
可维护性(组件级别) 一般 更高,封装在组件内部
学习曲线 简单 需要额外学习库知识

实战项目:做一个按钮组件

实战项目:做一个按钮组件

我们将分别用两种方式做一个小按钮组件,来看看各自的优缺点。

项目目标:

  • 按钮默认背景是蓝色
  • 鼠标悬停变为深蓝色
  • 点击后变为绿色

一、传统 CSS 实现

1. 创建 Button.css

.button-style {
  padding: 10px 20px;
  background-color: #4CAF50;
  border: none;
  color: white;
  cursor: pointer;
  font-size: 16px;
  border-radius: 4px;
  transition: background-color 0.3s;
}

.button-style:hover {
  background-color: #45a049;
}

2. 创建 Button.js

import React, { useState } from 'react';
import './Button.css';

function Button({ children }) {
  const [isClicked, setIsClicked] = useState(false);

  const handleClick = () => {
    setIsClicked(true);
  };

  return (
    <button
      className="button-style"
      onClick={handleClick}
      style={{ backgroundColor: isClicked ? 'green' : '' }}
    >
      {children}
    </button>
  );
}

export default Button;

App.js 中调用这个按钮:

import Button from './Button';

function App() {
  return <Button>点击我</Button>;
}

二、CSS-in-JS 实现(使用 styled-components)

1. 创建 Button.js

import React, { useState } from 'react';
import styled from 'styled-components';

const ButtonStyled = styled.button`
  padding: 10px 20px;
  background-color: ${(props) => (props.clicked ? 'green' : '#4CAF50')};
  border: none;
  color: white;
  cursor: pointer;
  font-size: 16px;
  border-radius: 4px;
  transition: background-color 0.3s;

  &:hover {
    background-color: #45a049;
  }
`;

function Button({ children }) {
  const [isClicked, setIsClicked] = useState(false);

  return (
    <ButtonStyled clicked={isClicked} onClick={() => setIsClicked(true)}>
      {children}
    </ButtonStyled>
  );
}

export default Button;

同样在 App.js 中引用即可。


三、实战对比分析

方面 传统 CSS CSS-in-JS
文件数量 多一个 .css 文件 全部写在一个文件中
样式更新 必须写 inline style 或额外类名 可直接通过 props 控制
模块化程度 高(组件样式封装紧密)
维护便利度 中等 更方便

常见问题解答(FAQ)

Q1:CSS-in-JS 不是违反关注点分离吗?

这是很多人对 CSS-in-JS 的第一印象。但现代前端强调的是组件化开发,一个组件应该包含自己的结构、逻辑、样式,三者统一才能保证可维护性和复用性。

CSS-in-JS 正是这种理念的体现:每个组件拥有自己的样式,而不是全局污染。


Q2:CSS-in-JS 性能差吗?

对于大多数应用来说,影响微乎其微。像 styled-components 会做缓存和优化,不会频繁地操作 DOM 插入 <style> 标签。

除非你是超大规模系统或追求极致性能优化,否则不用担心性能问题。


Q3:我能同时用传统 CSS 和 CSS-in-JS 吗?

当然可以!这在实际项目中很常见。例如:

  • 第三方库使用传统 CSS(如 Ant Design)
  • 自己写的组件使用 styled-components
  • 页面布局仍用 CSS Modules 或 Tailwind CSS

混合使用完全没有问题,关键是按需使用统一风格


学习建议与下一步路径

初学者推荐学习顺序:

  1. 先学会传统 CSS(掌握基本语法、盒模型、布局)
  2. 熟悉 JavaScript + React 基础
  3. 再尝试 CSS-in-JS
  4. 进阶:学习主题模式、响应式设计、CSS-in-JS 性能优化

推荐学习资源:


结语

CSS-in-JS 是现代前端开发中的一个重要趋势,特别是在使用 React、Vue 3 的 Composition API 等新技术时。

它并不是要完全替代传统 CSS,而是提供了一种更符合组件化思维的样式管理方式。

通过本文的学习,你应该已经了解了:

  • 什么是 CSS-in-JS?
  • 为什么要用它?
  • 如何在项目中使用?
  • 与传统 CSS 的区别与优劣

希望你能在实践中进一步探索,找到最适合自己的工作流。

如果你觉得这篇文章有帮助,欢迎分享给更多的初学者!

🎉 加油,未来的大前端工程师!

评论 0

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