每个 React 使用各自的 css 文件
在CSS模块中,每个组件的样式文件(通常是.module.css或.module.scss等)都会在构建时生成唯一的类名,从而避免全局样式冲突。
比如,你有两个组件ComponentA和ComponentB,它们各自有一个样式文件(ComponentA.module.css和ComponentB.module.css),并且都定义了.button:
1
2
3
4
|
/* ComponentA.module.css */
.button {
background-color: blue;
}
|
1
2
3
4
|
/* ComponentB.module.css */
.button {
background-color: blue;
}
|
在对应的JSX文件中,你会这样引入:
1
2
3
4
5
6
|
// ComponentA.js
import styles from './ComponentA.module.css';
function ComponentA() {
return <button className={styles.button}>A的按钮</button>;
}
|
1
2
3
4
5
6
|
// ComponentB.js
import styles from './ComponentB.module.css';
function ComponentB() {
return <button className={styles.button}>B的按钮</button>;
}
|
在构建后,这两个.button会被转换成不同的唯一类名(例如ComponentA_button_abc和ComponentB_button_def),因此不会相互覆盖。
这样,即使两个不同组件的CSS模块中有相同的类名,也不会产生样式冲突。
构建 css编译成单独文件
如果你使用Webpack和CSS模块(CSS Modules),你可以使用MiniCssExtractPlugin插件来将所有的CSS合并到一个单一的CSS文件中。以下是配置的一个基本示例:
首先,你需要安装插件:
1
|
npm install --save-dev mini-css-extract-plugin
|
然后在你的webpack.config.js文件中进行配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
// ...其它配置
module: {
rules: [
{
test: /\.module\.css$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]__[local]__[hash:base64:5]'
},
}
}
]
},
{
test: /\.css$/,
exclude: /\.module\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
},
// ...其它规则
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
// ...其它插件
],
};
|
在这个示例中,我为CSS模块和普通的CSS文件设置了两个不同的规则:
所有以.module.css结尾的文件被认为是CSS模块,并使用相应的配置。
所有其它的.css文件将被当作普通的CSS文件处理。
MiniCssExtractPlugin.loader会把所有的CSS提取到一个文件中。
配置完成后,运行Webpack构建,它会生成一个合并后的CSS文件,你可以在HTML中通过标签引入这个CSS文件。
这样,无论你使用的是CSS模块还是全局CSS,所有的样式都将被合并到一个单一的CSS文件中。
在上面的webpack.config.js示例中,MiniCssExtractPlugin的配置使用了占位符[name]和[id],这些占位符将根据每个入口点(entry point)或代码块(chunk)来动态生成文件名。
1.filename: ‘[name].css’: 这里的[name]通常是每个入口点(entry point)的名称。例如,如果你在webpack.config.js中有这样的入口配置:
1
2
3
4
|
entry: {
main: './src/index.js',
vendor: './src/vendor.js'
},
|
2.chunkFilename: ‘[id].css’: 这是用于异步加载(lazy-loaded)的代码块(chunks)的名称。
如果你只有一个入口文件,一般你会得到一个名为main.css的CSS文件。
在HTML中引用
1.手动添加:如果你知道生成的CSS文件名,你可以直接在HTML文件的
标签内使用
标签手动引入。
1
|
<link rel="stylesheet" href="path/to/generated/main.css">
|
2.自动添加:你也可以使用Webpack的HtmlWebpackPlugin插件自动将CSS文件引入到HTML中。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 在plugins数组中添加
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
}),
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
// ...其他插件
],
|
这样,HtmlWebpackPlugin会自动将生成的CSS文件插入到提供的HTML模板中。
通过这些方法,你可以确保正确引入由Webpack生成的CSS文件。