是的, 你沒有聽錯, 今天介紹的兩款 loader 能讓你的 webpack 在處理 sass 和 css 時效能提升 10 倍以上, 他們分別是:
看名字就知道, 它們相比官方版本的 loader 要更快, 那到底有多快? 下面給個效能對比.
效能對比
fast-sass-loader vs sass-loader
280+ 以上的 sass 檔案測試結果如下:
- sass-loader: 8517.218ms (7.15MB)
- fast-sass-loader: 1912.218ms (649KB)
可以看到 fast-sass-loader 的效能遠高於 sass-loader, 並且由於去重功能, 其打包的體積更小:
fast-css-loader vs css-loader
24000+ 行數的 css 檔案測試結果如下:
- css-loader: 1644 ms (608KB)
- fast-css-loader: 116 ms (608KB)
可以看到, 載入效能已經超過了 10 倍, 達到 14 倍左右了:
使用方法
使用方法和原版是相似的:
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'fast-css-loader' // 替換你原先的 css-loader
]
},
{
test: /\.(sass|scss)$/,
use: [
'style-loader',
'fast-css-loader', // 替換你原先的 css-loader
'fast-sass-loader' // 替換你原先的 sass-loader
]
}
]
}
}
複製程式碼
背後的原理
看到這裡, 你大概會問為啥這兩個 loader 要比官方快? 其實得問官方版本的 loader 慢在哪裡.
fast-sass-loader
對於 sass-loader 而言, 最大的問題是沒有去重, 導致 sass 檔案重複編譯, 因此 fast-sass-loader 最核心的地方在於針對 sass 檔案去重.
此外, fast-sass-loader 解決了 sass 檔案中 url 解析的問題. 原版 sass-loader 無法很好的處理 url(...)
中相對路徑的問題 (編譯前和編譯後, 相對路徑是會變的), 需要使用 url-resolve-loader, 但這個 loader 與 sourceMap 結合時又有許多 bug, 這在方面 fast-sass-loader 要做的更好.
當然, fast-sass-loader 確實是捨棄了一些特性以實現效能的提升:
- 不支援 sourceMap (個人認為 sass 的 sourceMap 可有可無)
- 不支援
importer
選項 - 不支援 某些寫法
fast-css-loader
css-loader 中最影響效能的部分是 postcss 解析 css 的過程, 當 css 檔案非常大時, 這一過程會特別慢, 而 fast-css-loader 則採用了正則和一些小技巧來實現 css 的解析, 在達到相同效果的前提下效能得到大幅提升.
由於未使用 postcss, 因此 fast-css-loader 也捨棄一些特性:
- 不支援 sourceMap (個人認為 css 的 sourceMap 可有可無)
- 不支援 css module
- 不支援在 js 中匯出 css 模組
背後的故事
寫這兩個 loader 的動機是我們的專案中有非常大規模的 sass 和 css, 原先的 sass-loader 和 css-loader 難以滿足我們對效能的要求. 其中 fast-sass-loader 已在很多內部專案中廣泛使用, 效果良好; 而 fast-css-loader 則是新鮮出爐的.
歡迎大家在自己的專案中試用 fast-sass-loader 和 fast-css-loader, 如果覺得不錯就加個 star 吧, 哈哈.
如果使用遇到問題, 請提 ISSUE 或直接 PR ~