CSS Modules

145 阅读1分钟

Is what ?

css modules 可以理解为:所有类名动画名称都默认有各自作用域的 css 文件。【CSS Modules 不是官方标准,也不是浏览器特性 ,只是在打包构建的时候,通过命名唯一实现对 CSS 限定作用域的一种方式!】

它的功能很简单,只是加入了局部作用域和模块依赖!

Why need ?

  • 避免全局命名冲突
  • 模块化和可重用性
  • 局部作用域和隔离性

How work ?

一. 命名规范:

CSS 的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。产生局部作用域的唯一方法就是使用一个独一无二的类名,不会与其他选择器重名!这就使 CSS Modules 的做法!

举栗:

App.js

9000.jpg

App.css

9001.jpg

我们在 js 文件中,引入 css 文件,并将其输入到 style 对象中。然后用 style.title 代表一个类名。

【构建打包】:

构建工具会把类名 style.title 编译为一个哈希字符串,如下所示:

9002.jpg

同时 css 文件也会被编译:

9003.jpg

这样以来,这个类名就独一无二了,哈哈!

【自定义命名规则】:

以 webpack 打包工具为例,我们可以在 webpack 的配置文件中自定义我们的命名规范:

9004.jpg

二. 全局作用域

CSS Modules 允许使用 :global(.className) 的语法,声明一个全局规则,都不会被编译为哈希字符串

9005.jpg

三. class 的组合(继承)【使用 compose关键字

在 CSS Modules ,一个选择器可以继承另一个选择器的规则。

举栗: 想让 .title 继承 .className 的样式

9006.jpg

也可以继承其它 CSS 文件中的样式:

举栗: app.css文件 继承 another.css 文件中的规则

9007.jpg

9008.jpg