webpack打包(六)--css模块化
接上一篇webpack打包(五)--使用loader处理图片
在app.js
中把引入的图片去掉
import React from "react";
import ReactDOM from "react-dom";
import "./common/style/main.css"
ReactDOM.render(
<div>React</div>,
document.getElementById("root")
);
css的模块化
仍然是使用css-loader
,对css-loader
进行配置,不再使用默认配置,在webpack.config
中修改
{
test: /\.(css)$/,
use: [
"style-loader",
{
loader:"css-loader",
options:{
module:true
}
}
]
}
把css-loader
中的module
设置为true
,开启模块化,默认是false
给main.css
加样式
.bg_red {
background: red;
}
.font_18 {
font-size: 18px;
}
.abc {
font-size: 40px;
}
模块化后样式的引用和使用方式要改变
修改后的app.js
import React from "react";
import ReactDOM from "react-dom";
import style from "./common/style/main.css"
ReactDOM.render(
<div className={style.bg_red}>React</div>,
document.getElementById("root")
);
main.css
引用后赋值给一个变量,class
的使用变成style.bg_red
模块化的优点
在style
文件夹下面新建other.css
文件
.abc {
font-size: 30px;
}
同样的,other.css
和main.css
一样有一个.abc
引入import other from "./common/style/other.css"
要是要使用main.css
里面的abc
→main.abc
,使用other.css
里面的abc
→other.abc
模块化后的样式,相当于有了一个命名空间,解决了不同样式文件class
冲突问题
一个问题
模块化后class
名字非常不友好,运行项目后发现class
的名字已经被loader进行了编译
审查元素并不知道自己所使用的class
原来是什么
class语义化
css-loader
提供了一个参数localIdentName
来控制编译后class
的命名,有三个参数path,name,local
path
:返回当前样式所在的目录name
:返回当前样式文件的名字local
:返回当前引用的class
名字
根据自己的需求进行语义化,修改webapck.config
的css-loader
配置
use: [
"style-loader",
{
loader: "css-loader",
options: {
module: true,
localIdentName: "[local]-[hash:base64:6]"
}
}
]
参数要用一对[]
包住
这里的[hash:base64:6]
代表生成一串以base64
编码的hash
值,长度为6
最后的结果