2023年的React样式化方法汇总
首先
你好!我是岩间正,是在ツクリンク担任Web应用工程师的。
在Tsuclink公司,我们目前正在考虑前端的后端架构。
所以,这次我们总结了在首选候选React中的样式化方法。
候选名单
我在Google上搜索了一下,也问了ChatGPT,找出了几个候选。
-
- CSS Modules (CSS模块化)
-
- Sass/SCSS (Sass/SCSS样式预处理器)
-
- CSS-in-JS (CSS在JavaScript中使用)
-
- Inline Styles (内联样式)
- CSS Frameworks (CSS框架)
CSS模块
CSS模块化是一种实现CSS模块化和封装的技术。
使用CSS模块化,样式表会以组件为单位进行封装,可以避免样式冲突和命名空间问题。
【主要特点和优点】
-
- 本地作用域:每个组件都属于本地作用域,因此即使在不同组件中使用相同的类名,样式也不会发生冲突。
避免名称冲突:通常的CSS在全局范围内定义类名,可能会导致名称冲突,但是CSS模块会自动生成唯一的类名来避免名称冲突。
样式的重用:可以在CSS模块中定义样式,并在不同的组件中重用。这样可以减少代码重复,提高代码维护性。
清晰的代码:样式和组件定义在相邻位置,使代码更易读,也更容易理解样式的目的和意图。
[实施案例] ànlì)
.button {
background-color: blue;
color: white;
}
import React from 'react';
import styles from './styles.module.css';
const MyButton = () => {
return (
<button className={styles.button}>
Click Me
</button>
);
}
export default MyButton;
Sass/SCSS ->Sass/SCSS (只需要一种选择)
使用Sass(Syntactically Awesome Style Sheets)或SCSS(Sassy CSS)进行样式设定的方法可以扩展普通的CSS,实现更高效的样式描述。
[主要特点与优势]
-
- 使用变量: 可以定义变量来存储样式属性和颜色代码,便于在多个地方使用相同的值,并更容易保持样式的一致性。
嵌套: 支持样式的嵌套,可以简洁地描述嵌套在父元素内的子元素的样式,使CSS的层次结构保持简单并提高可读性。
混合: 可以将常见的样式集合抽象化并在需要的地方重复使用,减少代码重复并提高可维护性。
运算: 支持算术运算,可以对样式属性进行计算。
导入: 可以将样式表文件分割,并导入部分文件,增加项目中样式的模块化和可重用性。
适用于规模: 在大型项目中使用Sass/SCSS可以更轻松地整理和管理样式,并有助于团队合作。
实时编译: 提供了许多工具来实时编译Sass/SCSS文件,可以立即查看更改,加快开发过程。
可扩展性: 作为对CSS的扩展提供,很容易与现有的CSS代码集成,并逐步引入。
[implementation example] – [实施例] lì)
.custom-button {
background-color: #007bff;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
&:hover {
background-color: darken(#007bff, 10%);
}
}
import React from 'react';
import './Button.module.scss';
const Button = () => {
return (
<button className="custom-button">Click Me</button>
);
};
export default Button;
CSS-in-JS可以被简单地理解为将CSS样式直接嵌入到JavaScript代码中。
CSS in JS 是一种在 JavaScript 代码中定义和应用 CSS 样式的方法。它使用 JavaScript 对象来定义 CSS 样式,而不是传统的 CSS 文件,然后在基于组件的应用程序和框架中应用这些样式。
为了实现这个目标,有几种方法可供选择,我们这次选择了代表性的几种。
ChatGPT提出的候选项
-
- Styled-components
-
- Emotion
-
- JSS(JavaScript Style Sheets)
-
- Glamorous
-
- Aphrodite
- Linaria
从npm trands获取


根据上述结果,我们将关注前三名,在这些项目中,既有维护也有多位用户。Emotion作为后来新出现的项目,追赶的速度令人惊叹。
顺便提一下,在截至2021年的使用率统计网站上,Styled-components排名首位,而Emotion排名第四。

我們將介紹從這裡挑選出來的事物。
样式组件
Styled-components 是一個流行的 CSS in JS 库,它使用 JavaScript 的模板字符串來定義 CSS 样式,并应用于 React 组件。
[主要特点和优点]
-
- 组件化样式:通过将组件与样式关联起来,在基于组件的应用程序中可以有效地封装样式。
使用JavaScript进行样式定义:可以直接在JavaScript中嵌入CSS,并使用变量和条件语句动态修改样式。
CSS共享和重用:可以将样式定义为组件,并包装为可重用的样式组件。
管理样式的优先级:可以自动管理样式的优先级,防止CSS冲突和名称冲突。
性能优化:提供了性能优化功能,如服务器端渲染和代码分割。不需要的样式被删除,从而提高页面加载速度。
自动添加前缀:自动生成厂商前缀,确保跨浏览器的兼容性。
调试支持:与调试工具集成,开发人员可以更容易地发现样式问题。
[示例实施]
import React from 'react';
import styled from 'styled-components';
const StyledButton = styled.button`
background-color: #007bff;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
&:hover {
background-color: #0056b3;
}
`;
const Button = ({ label, onClick }) => {
return (
<StyledButton onClick={onClick}>{label}</StyledButton>
);
};
export default Button;
情感
Emotion是一個性能優先的CSS in JS庫,用於支持React應用程序的樣式化。
主要特点和优势
-
- 高性能: 在编译CSS样式时生成优化输出,注重性能。生成的样式经过最小化CSS和消除重复等优化,提高页面加载速度。
动态样式: 可以使用JS定义样式,轻松处理动态样式,并使用条件语句和变量来控制样式。
组件化样式: 将组件与样式结合起来,推进组件化样式(样式的封装)。
样式的可重用性: 可以将样式抽象为可重用的函数或组件,从而方便共享样式,减少代码重复。
自动生成CSS前缀: 自动生成供应商前缀,确保跨浏览器兼容性。
支持服务器端渲染(SSR): 支持服务器端渲染,提高初始显示性能。
与移动应用集成: 可与React Native等移动应用开发集成,提供一致的样式处理方法。
支持调试: 与调试工具配合,提供调试信息以便更容易确定样式问题。
从外观上看,它与Styled-components非常相似。
【示例实现】
import { css } from '@emotion/react';
const buttonStyle = css`
background-color: #007bff;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
&:hover {
background-color: #0056b3;
}
`;
const Button = () => {
return (
<button css={buttonStyle}>Click me</button>
);
};
export default Button;
JSS(JavaScript样式表)
JSS(JavaScript Style Sheets)是一种CSS in JS库,它是在JavaScript内定义和应用样式的方法之一。
【主要特征与优点】
-
- 动态样式:在JS中定义样式,使得动态样式更容易。可以使用变量和条件语句来根据组件的状态来改变样式。
组件作用域:将样式与组件关联,确保样式不会影响其他组件(样式的封装)。
样式的重用:样式可以定义为可重用的类或对象,从而使样式的共享和维护更容易。
支持服务器端渲染(SSR):支持服务器端渲染,提高初始显示的性能。提供一致的样式,以供客户端和服务器使用。
自动生成供应商前缀:自动生成供应商前缀以确保跨浏览器的兼容性。
性能优化:提供优化样式的功能,以排除不必要的样式。
支持动画:更容易定义动画样式,并帮助使用JS控制动画。
支持调试:提供调试信息,与工具集成以更轻松地识别样式问题。
[实施示例] lì)
import React from 'react';
import jss from 'jss';
import preset from 'jss-preset-default';
jss.setup(preset());
const styles = {
button: {
backgroundColor: '#007bff',
color: '#fff',
padding: '10px 20px',
border: 'none',
borderRadius: '5px',
cursor: 'pointer',
'&:hover': {
backgroundColor: '#0056b3',
},
},
};
const { classes } = jss.createStyleSheet(styles).attach();
const Button = () => {
return (
<button className={classes.button}>Click me</button>
);
};
export default Button;
内联样式
React的内联样式(Inline Styles)是一种通过JavaScript对象指定样式信息并应用于React组件的方法。
简而言之,就是直接编写样式。
[主要特点和优势]
因为与其他方法不同,它很难被再利用,有性能问题等等,并没有太大的优点,所以我会省略它。(如果有人不同意,并认为内联是更好的选项,请在评论中提出)
[实施例] lì)
import React from 'react';
const buttonStyle = {
backgroundColor: '#007bff',
color: '#fff',
padding: '10px 20px',
border: 'none',
borderRadius: '5px',
cursor: 'pointer',
};
const Button = () => {
return (
<button style={buttonStyle}>Click me</button>
);
};
export default Button;
CSS 框架
CSS框架提供了用于样式化组件、实用类、网格系统、表单元素等的常见样式模式。
与其他样式手法明显不同的是,它提供了组件等所需功能,因此需要按照提供的功能进行创建。(在其他方法中需要自己创建)
[主要特点和优势]
-
- 1. 有效率的开发:通过提供通用的样式模板,能够节省时间和精力在开始新项目时。
-
- 2. 设计一贯性:提供一致的设计风格,可以在不同的部分重用相同的设计元素,从而提升设计的一致性。
-
- 3. 支持响应式设计:许多CSS框架提供响应式设计的网格系统,使得适用于不同屏幕尺寸和设备的样式应用变得容易。
-
- 4. 社区和文档支持:常用的CSS框架得到了广泛采纳,有许多社区支持和文档可用。有助于解决问题和应对挑战。
-
- 5. 安全性和质量:通常会融入安全最佳实践,并且具备保证质量的特点。
-
- 6. 可定制性:许多CSS框架具有可定制性,可以根据项目的需求进行调整。可以根据需要扩展框架并覆盖样式。
-
- 7. 快速原型制作:能够快速创建应用程序或网站的原型。
- 8. 跨浏览器兼容性:支持准确应用样式以确保跨浏览器兼容性。
使用CSS框架可以迅速创建特别是用于7个应用程序和网站的原型,这是使用CSS框架的一个重要优点。
[主要的CSS框架]
-
- MUI(Material-UI)
-
- Bootstrap
- Ant Design
[实施示例:针对MUI的情况]
我个人非常喜欢MUI,所以以它为例子。
import React from 'react';
import { TextField, Button, Container, Typography } from '@mui/material';
const SampleForm = () => {
const [name, setName] = React.useState('');
const [email, setEmail] = React.useState('');
const handleSubmit = (event) => {
event.preventDefault();
// ここでフォームの値を使った何かしらの処理を実行
};
return (
<Container maxWidth="sm">
<Typography variant="h4" align="center" gutterBottom>
Sample Form using MUI
</Typography>
<form onSubmit={handleSubmit}>
<div style={{ marginBottom: '1rem' }}>
<TextField
label="Name"
variant="outlined"
fullWidth
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
<div style={{ marginBottom: '1rem' }}>
<TextField
label="Email"
variant="outlined"
fullWidth
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<Button variant="contained" color="primary" type="submit">
Submit
</Button>
</form>
</Container>
);
};
export default SampleForm;
即风CSS
Tailwind CSS是一种与传统CSS框架不同的CSS实用工具框架。
[主要特点与优势]
-
- 功能优先:可以使用单一的类应用样式,直观且快速地进行样式设置。例如,可以直接指定颜色和文本大小,例如 class=”bg-blue-500″ 或 class=”text-xl”。
可定制性:灵活且可定制。可以使用 tailwind.config.js 文件自定义不同样式,如颜色、字体大小、间距、阴影、网格等。这使得可以为每个项目构建独特的设计系统。
低学习成本:与其他 CSS 框架相比,Tailwind 的学习成本相对较低。由于采用了与常规 CSS 不同的方法,一旦理解基本的类和语法,就能实现灵活的样式设置。
高效开发:便于实现整个项目的统一设计,能够快速进行开发。样式的一致性容易保持,能够在 HTML 中编写直观易读的代码。
性能:在构建时使用,因此在生产环境中会删除冗余的类并生成优化的 CSS。
这次调查的结果显示,尽管它是一个CSS框架,但在npm trends排行榜上占据了前列,因此特意将其放在最后一位。

[实施示例]
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
import React from 'react';
const App = () => {
return (
<div className="bg-gray-100 h-screen flex items-center justify-center">
<div className="bg-white p-8 rounded shadow-lg">
<h1 className="text-2xl font-bold mb-4">Welcome to My App</h1>
<p className="text-gray-700">This is a Tailwind CSS example in a React app.</p>
<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded mt-4">
Click me!
</button>
</div>
</div>
);
};
export default App;
总结
我总结了关于React的样式化方法。虽然有一些潮流,但个人认为最重要的是选择适合组织和体制的方法,而不仅仅是哪种方法更好。因此,我将在选择时意识到这一点。
如果這篇文章的特點和示例代碼中有任何錯誤,請在評論中指出,因為它們是使用ChatGPT生成的。