vue組件里不用的css還在搜索過濾來刪除?試一下vue-clearcss吧!

這篇文章其實是推廣介紹我個人的npm工具庫,但你不會後悔點進來的(應該吧。。。)vue-clearcss

為什麼要用它?

一個vue文件在長期迭代中css會越來越冗餘,它不像html和js那麼好刪除,html你要是多了頁面會展示,js你只要看下它用的地方就可以了
然而css比如scss、less都是用嵌套語法,要是你通過搜索刪除那麼有可能它在html有定義,但是它的上級不對,一樣是無效的css,通過這
個工具,你可以快速找到無用的css

怎麼用它?

使用方法非常簡單

// 安裝一下
 npm install -g vue-clearcss

// 然後在你的項目里就可以直接使用了,它會在控制台列印出所有無用的css,
// 支援文件和目錄的方式,文件路徑可以通過vscode等ide右鍵選擇路徑直接黏貼
 unvuecss ./src/App.vue

同類工具對比

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咯。