在讲CSS Modules以前,先想一想什么是CSS Module?css
在我眼中CSS Module是对css进行模块化的管理,更加深刻的解释就是用来管理css样式的导入与导出。灵活按需导入以便复用代码,导出的时候要合理的分割域的界限。html
模块化实际过程当中遇到的问题有以下几点:react
进程后移,CSS Module的发展中,出现了sass、less等一系列解决css编程能力弱的问题和样式污染的问题,可是他们并无很好地解决模块化其余的问题webpack
在以前,还出现过一种方案叫 css in js,这种写法至关于彻底抛弃了css,在js中经过hash映射来写css,这个写法的好处和坏处都很明显。git
而后就是咱们的CSS Modules, CSS Module的问题他都能解决的比较好github
CSS Modules的官方文档以下:github.com/css-modules…web
简单的例子来描述写它的使用方式,算法
首先在webpack中进行对应的设置,以后进行对应的引用编程
/*webpack.js*/
css?modules&localIdentName=[name]__[local]-[hash:base64:5]
/*Button.css*/
.normal{}
.disabled{}
/*Button.js*/
import styles from './Button.css'
render(){
reutrn(
<button class=${styles.normal}></button>
)
}
最终生成的html以下
<button class="button-normal-abc5436"></button>
复制代码
后面的abc3546是按照localIdentName自动生成的class名称,按照给定算法生成的序列码,这样处理以后,大大下降了项目中样式覆盖的概率 。同时生成更短的class名能够提升css的压缩效率sass
默认状况下,样式是局部内容,若是要切换成全局的样式能够用:global进行包裹
样式复用在CSS Modules中也是能够作到的,相对于less sass来讲麻烦一点,须要用composes来组合样式,固然如今CSS Modules也是能够结合less的
.base{}
.normal{
composes:base
}
复制代码
以上CSS Modules的命名规则是源于BEM的。BEM是一种css命名模板,具体内容以下:
B:block,对应模块名,如dialog
E:element 对应模块中的节点,如button
M:modifier 对应节点的状态,disabled
最终class名 dialog__button--disabled 在不少大型项目中均可以看到这样的命名写法
CSS Modules实现变量共享
config.css
css{
$primary-color:#ffffff;
}
app.js
import style from 'config.css'
console.log(style.primaryColor)
复制代码
不过CSS Modules在实际开发中会带来书写的反作用,每个class前面都须要加一个styles,这样增长了书写的负担,若是不想频繁的书写,可使用react-css-modules库,经过高阶组件的形式避免重复输入css 核心代码以下:
import React,{Component} from 'react'
import styles from './config.css'
import CSSModules from 'react-css-modules'
class Dialog extends Component{
render(){
return(
<div styleName={root}></div>
)
}
}
export default CSSModules(Dialog,styles)
复制代码
这样书写以后的好处有以下几个: