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

郑刚
2025-06-24 10:28
阅读 528

开篇:什么是 CSS 样式方案?为什么会有“两种流派”?

开篇:什么是 CSS 样式方案?为什么会有“两种流派”?

在网页开发中,CSS(层叠样式表) 是用来美化网页的工具。它可以控制页面元素的颜色、形状、排列方式等外观属性。

但随着前端技术的发展,传统的写 CSS 的方式逐渐暴露出一些局限性,比如:

  • 样式容易全局污染
  • 组件化项目中难以维护样式作用域
  • 多人协作时命名冲突频发
  • 动态样式支持不强

于是,一种新的写法诞生了:CSS-in-JS。它不是替代 CSS,而是通过 JavaScript 来动态管理样式规则。你可以把它理解成:“用写代码的方式写样式”。

那么问题来了:

我是零基础的新手,该选哪种方式学呢?

这篇文章就为你讲清楚这两个技术之间的区别和联系,帮助你从零开始入门,并做出适合自己的选择。


环境准备:我们先来搭建一个最小可运行的环境

环境准备:我们先来搭建一个最小可运行的环境

我们要对比学习,所以需要一个可以同时体验“传统CSS”和“CSS-in-JS”的小环境。

第一步:安装 Node.js 和 npm

👉 访问官网下载安装:https://nodejs.org/
推荐使用 LTS 版本

安装完成后,在终端执行:

node -v    # 显示版本号表示安装成功
npm -v

第二步:创建你的第一个 React 项目

我们将使用 Vite 快速创建一个 React + JS 项目(支持多种样式方案):

npm create vite@latest my-styling-app --template react
cd my-styling-app
npm install
npm run dev

访问 http://localhost:5173,你会看到一个默认页面,说明项目已经启动成功。


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

我们用最通俗的语言解释这两个概念。


一、传统CSS的工作方式

传统 CSS 就是你写的 .css 文件,然后在 HTML 或 React 中通过 className="xxx" 来应用。

示例:一个按钮组件

// App.jsx
import './App.css'

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

export default App
/* App.css */
.btn {
  background-color: blue;
  color: white;
  padding: 10px 20px;
}

🎯 特点总结:

特点 说明
文件分离 样式和结构分开
全局作用域 所有类名都可能重复
编译简单 支持浏览器原生直接解析
可维护性较低 大型项目中易混乱

二、CSS-in-JS 的工作原理

这种方式是将样式写在 JavaScript 中,通常借助第三方库来实现。它的核心思想是:“每个组件拥有自己的样式,互不干扰”。

常见 CSS-in-JS 库包括:

  • styled-components
  • emotion
  • stitches
  • linaria

示例:用 styled-components 写按钮组件

首先安装依赖:

npm install styled-components

修改 App.jsx

// App.jsx
import styled from 'styled-components'

const StyledButton = styled.button`
  background-color: green;
  color: white;
  padding: 10px 20px;
  font-size: 16px;
`

function App() {
  return (
    <StyledButton>绿色按钮</StyledButton>
  )
}

export default App

🎯 特点总结:

特点 说明
模块化好 每个组件有自己的样式
防止类名冲突 自动生成唯一类名
动态样式的强大支持 可根据 props 动态变化
构建过程复杂一点 需要编译插件

实战项目:用两种方式实现一个卡片组件

我们来动手做一个简单的项目 —— 展示用户信息的卡片。

第一步:创建一个基本结构

App.jsx 中写一个卡片结构:

function UserInfoCard({ name, age }) {
  return (
    <div className="user-card">
      <h3>{name}</h3>
      <p>年龄:{age}</p>
    </div>
  )
}

并导出 App:

export default function App() {
  return (
    <UserInfoCard name="张三" age={28} />
  )
}

方式一:传统 CSS 写法

新增文件:UserInfoCard.css

.user-card {
  border: 1px solid #ccc;
  padding: 20px;
  max-width: 300px;
  margin: 20px auto;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  border-radius: 8px;
}

然后在 UserInfoCard.jsx 中导入:

import './UserInfoCard.css'

✅ 成功了!现在你有一个带样式的卡片组件。


方式二:使用 CSS-in-JS(emotion)

安装 emotion(轻量级流行库):

npm install @emotion/react @emotion/styled

修改 UserInfoCard.jsx

/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react'

const cardStyle = css`
  border: 1px solid #ccc;
  padding: 20px;
  max-width: 300px;
  margin: 20px auto;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  border-radius: 8px;
`

function UserInfoCard({ name, age }) {
  return (
    <div css={cardStyle}>
      <h3>{name}</h3>
      <p>年龄:{age}</p>
    </div>
  )
}

export default UserInfoCard

📌 注意注释开头这句:

/** @jsxImportSource @emotion/react */

这是告诉系统你要用 emotion 渲染 JSX 中的样式。

✅ 现在你实现了同样的卡片,只不过用了完全不同的样式书写方式!


常见问题解答(FAQ)

下面是你作为新手可能会遇到的一些疑问,帮你扫清困惑:


❓ Q:CSS-in-JS 性能好吗?会不会很慢?

A:
CSS-in-JS 在现代框架下优化得很好,像 emotionstyled-components 都内置缓存机制。除非你极端大量动态样式,否则性能不会有明显差距。

建议初学者优先关注功能实现,而不是微优化。


❓ Q:CSS 文件和 JS 文件混在一起不会乱吗?

A:
这正是 CSS-in-JS 的优势之一!组件级封装让你更容易找到某部分对应的样式。而传统项目如果 CSS 文件太多,反而会更难管理。


❓ Q:CSS-in-JS 需要编译吗?会不会配置太复杂?

A:
大多数主流构建工具(如 Vite、Webpack)已经内建支持这些库,开箱即用。你只需要安装对应库即可,无需额外配置


❓ Q:我以后找工作,应该学传统CSS还是CSS-in-JS?

A:
两个都要掌握基础!现在的实际项目中,两种都有使用场景:

  • 如果你做的是大厂项目或开源组件库 → 推荐 CSS-in-JS
  • 如果你做的是一些中小型企业站或 WordPress 主题 → 传统 CSS 更常用

掌握两者的共性和差异才是关键。


学习建议:下一步怎么深入学习?

前端开发工具界面-1

你已经掌握了两种写法的核心思路,也完成了简单的实践。接下来可以根据兴趣方向继续深入:


🧩 方向一:深入传统CSS

如果你喜欢结构清晰、追求设计细节,可以从以下方面入手:

  • CSS BEM 命名规范(防止类名冲突)
  • CSS 预处理器(如 Sass / Less)
  • PostCSS 插件生态
  • CSS Grid & Flexbox 布局精进

📚 推荐资源:


⚛️ 方向二:精通 CSS-in-JS(React 专属)

如果你专注于 React 生态、组件库开发或状态驱动样式,建议深入这些内容:

  • styled-components 完全指南
  • Emotion 的主题系统与 SSR 支持
  • 使用 TypeScript 结合样式定义
  • 自定义样式函数/条件逻辑

📚 推荐资源:


✅ 总结回顾

在本文中,我们从零讲解了:

  • CSS 的基本作用
  • 传统 CSS 和 CSS-in-JS 的区别
  • 如何快速搭建环境进行实践
  • 一个真实项目的两种写法对比
  • 新手常遇到的问题及解答
  • 后续的学习方向建议

你现在拥有了一个清晰的方向来选择适合自己当前阶段的技术路径。希望这篇教程帮助你在前端学习路上迈出了坚实的一步。

如果你想继续了解样式系统的进阶话题,如 CSS Modules、Tailwind CSS、CSS 变量等,请留言告诉我,我会为你准备下一章 😊

评论 0

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