Is what ?
css modules可以理解为:所有类名和动画名称都默认有各自作用域的 css 文件。【CSS Modules 不是官方标准,也不是浏览器特性 ,只是在打包构建的时候,通过命名唯一实现对 CSS 限定作用域的一种方式!】
它的功能很简单,只是加入了局部作用域和模块依赖!
Why need ?
- 避免全局命名冲突
- 模块化和可重用性
- 局部作用域和隔离性
How work ?
一. 命名规范:
CSS 的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。产生局部作用域的唯一方法就是使用一个独一无二的类名,不会与其他选择器重名!这就使 CSS Modules 的做法!
举栗:
App.js
App.css
我们在 js 文件中,引入 css 文件,并将其输入到 style 对象中。然后用 style.title 代表一个类名。
【构建打包】:
构建工具会把类名 style.title 编译为一个哈希字符串,如下所示:
同时 css 文件也会被编译:
这样以来,这个类名就独一无二了,哈哈!
【自定义命名规则】:
以 webpack 打包工具为例,我们可以在 webpack 的配置文件中自定义我们的命名规范:
二. 全局作用域
CSS Modules 允许使用
:global(.className)的语法,声明一个全局规则,都不会被编译为哈希字符串
三. class 的组合(继承)【使用 compose关键字】
在 CSS Modules ,一个选择器可以继承另一个选择器的规则。
举栗: 想让 .title 继承 .className 的样式
也可以继承其它 CSS 文件中的样式:
举栗: app.css文件 继承 another.css 文件中的规则