在講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)
複製代碼
這樣書寫以後的好處有以下幾個: