postcss是什么?
根據(jù)官網(wǎng)的解釋,它是一種javascript編寫的工具,用來轉(zhuǎn)化css的。可以認(rèn)為它是處理css的插件集合,需要配合諸如webpack、gulp等編譯工具才能展現(xiàn)它強(qiáng)大的能力。
目前社區(qū)提供了非常多的插件,比較有名的如下:
- autoprefixer可以為css的屬性配置兼容性的前綴,不需要手動添加
- postcss-preset-env允許你使用更加現(xiàn)代的css特性
- stylelint檢查css語法錯(cuò)誤
- cssnanocss的壓縮器
- 等等
postcss的原理
如果大家了解babel的原理,那就應(yīng)該聽說過AST即抽象語法樹。編譯器將字符串進(jìn)行詞法分析、語法分析,再做轉(zhuǎn)換,最終達(dá)到預(yù)期的結(jié)果。postcss也是同樣的原理,這個(gè)包已經(jīng)為使用者提供了解析的方法parse,并且也提供了很多轉(zhuǎn)化的API,利用這些就可以自己開發(fā)一款postcss插件了。
cssModule是什么?
先前呢,我們使用css選擇器,它是對整個(gè)頁面是有效的,也就是全局的,當(dāng)你每次迭代需求的時(shí)候,需要考慮每次添加新的css是否會影響到其他地方,所以我們有時(shí)選擇為樣式表添加命名空間。cssModule為我們提供了另外一種開發(fā)方式,它可以使css具有局部作用域。
用法如下:
用法是如此的簡單,基本一看就會,css-loader為我們提供了cssModule的開關(guān),只要為css-loader添加參數(shù)選項(xiàng)modules就可以開啟。注意:它必須放在less或者sass的loader之前。
那它如何做到局部作用域的呢?
打開element面板可以發(fā)現(xiàn),它把class變成了md5戳,對應(yīng)每個(gè)組件,保持唯一。
vue的scoped
由此我們聯(lián)想到vue的scoped,它也解決了css局部作用域的問題!
它在dom上生成了一個(gè)data屬性,并且給class選擇器添加了屬性選擇器,類似于之前的md5戳。不過由于添加了屬性選擇器,使得選擇器的優(yōu)先級變高了,想在組件外面覆蓋css屬性就變得不那么容易了!