vue-clearcss 會找到你css中沒有使用的css樣式,是否刪除由使用者自己決定,工作起來就像eslint
為什么要用它?
一個vue文件在長期迭代中css會越來越冗余,它不像html和js那么好刪除,html你要是多了頁面會展示,js你只要看下它用的地方就可以了
然而css比如scss、less都是用嵌套語法,要是你通過搜索刪除那么有可能它在html有定義,但是它的上級不對,一樣是無效的css,又或者有人用了bem的寫法,像html上寫的是a--b,但是scss寫的方式是a{ &--b{} },你通過搜索的方式還不好匹配,通過這個工具,你可以快速找到無用的css
怎么用它?
使用方法非常簡單
// 安裝一下
npm install -g vue-clearcss
// 然后就可以在你的項目里的控制台直接使用了,它會在控制台打印出所有無用的css,
// 支持文件和目錄的方式,文件路徑可以通過vscode等ide右鍵選擇路徑直接黏貼
unvuecss ./src/App.vue
如果你用的是vscode,那么使用更加方便,在擴展里面搜索vue-clearcss-ext,安裝擴展還有上面全局安裝的vue-clearcss就可以了,效果如下
同類工具對比
PurgeCSS:這個工具是通過正則把所有的html單詞匹配出來,然后看css里面是否有相同的元素,所以匹配不是很正確,比如說我的html里
有一個class叫aa,然后css有個id也叫aa,那么它是會通過驗證的,因為html里面有這個單詞aa
UNCSS:這個工具是通過jsdom的querySelector方法來實現的,但是vue不是單純的html所以不能直接使用,官網給的建議是vue最后展現的頁面再去搜索多余css,個人覺得不夠好用。(我匹配css的方式就是參考了jsdom的querySelector相關源碼,也是使用動態模板生成函數實現的)
不到位的地方
1 所有的偽類選擇器都認為是有用的
2 所有的屬性選擇器 (除了[attribute] 和 [attribute=value] 可以完美過濾),其他都是使用js的includes方法來匹配,其實就是懶用的少的現在還不想兼容。。
3 過濾結果只針對該文件是無用,但有可能該css元素是用來影響子組件的,需要你自己確認,這也是為什么我不像去放入webpack加入打包的只是打印出來自己選擇是否刪除的原因,如果考慮到對子組件的影響,那么子組件又會嵌套自己的子組件,那么html的ast會變得非常的巨大,但是父組件影響子組件的情況又很少,所以不適合做。(其實也不推薦父組件寫子組件樣式,如果你寫了也應該會有印象吧。)
4 動態class除了在js里賦值的情況都可以解析,例如:class='classobjinjs' 這種無法解析,(暫時除了正則還沒有特別好的方法去解析字符串形式的js)
5 我沒寫出來的都是自認為考慮到了,兼容的很不錯的,哈哈哈
如果匹配的結果有誤,歡迎提出,也希望各位大佬給個star咯。