# CSS模块化
>A CSS Module is a CSS file in which all class names and animation names are scoped locally by default. CSS模块就是所有的类名都只有局部作用域的CSS文件。
css-loader
[https://www.npmjs.com/package/css-loader](https://www.npmjs.com/package/css-loader)
## Options
| Name | Type | Default | Description |
| --- | --- | --- | --- |
| **[`url`](https://www.npmjs.com/package/css-loader#url)** | `{Boolean\|Function}` | `true` | Enable/Disable`url()`handling |
| **[`import`](https://www.npmjs.com/package/css-loader#import)** | `{Boolean\|Function}` | `true` | Enable/Disable @import handling |
| **[`modules`](https://www.npmjs.com/package/css-loader#modules)** | `{Boolean\|String\|Object}` | `false` | Enable/Disable CSS Modules and setup their options |
| **[`sourceMap`](https://www.npmjs.com/package/css-loader#sourcemap)** | `{Boolean}` | `false` | Enable/Disable Sourcemaps |
| **[`importLoaders`](https://www.npmjs.com/package/css-loader#importloaders)** | `{Number}` | `0` | Number of loaders applied before CSS loader |
| **[`localsConvention`](https://www.npmjs.com/package/css-loader#localsconvention)** | `{String}` | `asIs` | Setup style of exported classnames |
| **[`onlyLocals`](https://www.npmjs.com/package/css-loader#onlylocals)** | `{Boolean}` | `false` | Export only locals |
## 修改配置参数
在这个配置参数 中我们可以发现有一个modules它其实就是将样式模块化。我们可以修改`webpack.config.js`
~~~
{test:/\.css$/,use:['style-loader',{loader:'css-loader', options: {modules:true}}]},
~~~
效果如下:
![](https://box.kancloud.cn/2996bb965b5794ecde7dc6e3405f80d3_336x327.png)
## 使用样式
我们发现默认不会有任何的样式,说明模块化样式已经生效了,那么,我们的样式又该如何应用呢?
我们修改commet.js组件。
~~~
import style from './commet.css'
console.log(style)
~~~
查看打印的结果
```
{title: "qdjH7MkTnUkcOOte2sc2r"}
```
应用样式
~~~
<div className={style.title}>评论组件标题</div>
~~~
![](https://box.kancloud.cn/3234f310f674932befc849f55b4be66a_1006x221.png)
至些模块化应用的基础已经完成。这样已经实现了模块化样式。
## 总结
1.通过上面我们了解了CSS模块化,CSS模块就是所有的类名都只有局部作用域的CSS文件。
2.想要实现CSS模块化那么必须修改`webpack.config.js`的`css-loader`。添加配置参数 `options: {modules:true}`
3.应用模块化,`import style from './commet.css'`
4.给标签添加类名 `className={style.className}`
## 思考
那么通过上面我们也已经了解了CSS模块化的概念和使用,那么接下来就是多写多练。但是,我们了解了问题,相应的问题也来了,怎么维护样式呢?
我们发现它的**类名是一串随机字符串**如果我们样式书写的有问题,如何快速定位到这个样式?两种办法
1.可以配置[`sourceMap`](https://www.npmjs.com/package/css-loader#sourcemap)
2.随机字符串规则化。[localIdentName] ([https://www.npmjs.com/package/css-loader#localidentname](https://www.npmjs.com/package/css-loader#localidentname))
上面两种办法都可以,也可以结合在一起使用。工作中按照多年的工作经验 我会选择第二种多一些。
**css-loader@2.x配置**
~~~
{test:/\.css$/,use:['style-loader',{loader:'css-loader', options: {modules:true,sourceMap:true,localIdentName:'[name]__[local]--[hash:5]'}}]},
~~~
**css-loader@3.x配置**
{test:/\.css$/,use:['style-loader',{loader:'css-loader', options: {modules:{localIdentName:'[name]__[local]--[hash:5]'},sourceMap:true,}}]},
name表示是css文件名称,local表示是原本的类名,后面紧跟的是hash根据文件生成的随机字符串。
效果如下
![](https://box.kancloud.cn/7118fccb1b6a9a5fb4f2179269e3eaea_1913x202.png)
- webpack复习
- React基础
- 前端三大主流框架对比
- React中几个核心的概念
- React基础语法
- React JSX语法
- React组件
- 普通组件
- 组件通信-父向子传递
- 组件拆成单个文件
- 面向对象复习
- Class组件基础
- Class组件的私有状态(私有数据)
- 案例:实现评论列表组件
- 组件样式管理
- 组件样式分离-样式表
- CSS模块化
- 生命周期
- React组件生命周期
- Counter组件来学习组件生命周期
- 生命周期总结
- 生命周期案例
- React评论列表
- React双向数据绑定
- React版todolist
- 其它提高(了解)
- 组件默认值和数据类型验证
- 绑定this并传参的三种方式
- 祖孙级和非父子组件传递数据(了解)
- React路由
- 路由基础
- 动态路由
- 路由严格模式
- 路由导航定位
- 路由重定向
- 路由懒加载
- WolfMovie项目
- 项目初始化
- AntDesign使用
- 其它相关了解