- 在我們工作中抹缕,優(yōu)化自己的工作環(huán)境永遠是一大難題,我們只有通過不斷學習和實驗墨辛,慢慢改善自己的編程環(huán)境卓研,下面我就減少webpack打包相關優(yōu)化,大家可以學習和參考睹簇。本文章出自拉勾教育大前端就業(yè)一班
優(yōu)化Loader
對于Loader來說奏赘,影響打包效率首當其沖必屬Babel,因為Babel會將代碼轉為字符串生成AST太惠,然后對AST繼續(xù)進行轉變最后再生成新的代碼磨淌,項目越大,轉換代碼越多凿渊,效率就越低
首先我們可以優(yōu)化Loader的文件搜索范圍
module.exports = {
module: {
rules: [
{
// js 文件才使用 babel
test: /\.js$/,
loader: 'babel-loader',
// 只在 src 文件夾下查找
include: [resolve('src')],
// 不會去查找的路徑
exclude: /node_modules/
}
]
}
}
對于Babel來說梁只,我們肯定是希望只作用在JS代碼上的,然后node_modules中使用的代碼都是編譯過的埃脏,所以我們也完全沒有必要再去處理一遍敛纲。
HappyPack
受限于Node是單線程運行的,所以Webpack在打包過程中也是單線程的剂癌,特別是在執(zhí)行Loader的時候淤翔,長時間編譯的任務很多,這樣就會導致等待的情況
HappyPack 可以將Loader的同步執(zhí)行轉換為并行
loaders: [
{
test: /\.js$/,
include: [resolve('src')],
exclude: /node_modules/,
// id 后面的內容對應下面
loader: 'happypack/loader?id=happybabel'
}
]
plugins: [
new HappyPack({
id: 'happybabel',
loaders: ['babel-loader?cacheDirectory'],
// 開啟 4 個線程
threads: 4
})
]
DllPlugin
DllPlugin可以將特定的類庫提前打包然后引入佩谷,這種方式可以極大減少打包類庫的次數旁壮,只有當類庫更新版本才有需要重新打包,并且也實現了將公共代碼抽離成單獨文件的優(yōu)化方案
// 單獨配置在一個文件中
// webpack.dll.conf.js
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: {
// 想統(tǒng)一打包的類庫
vendor: ['react']
},
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].dll.js',
library: '[name]-[hash]'
},
plugins: [
new webpack.DllPlugin({
// name 必須和 output.library 一致
name: '[name]-[hash]',
// 該屬性需要與 DllReferencePlugin 中一致
context: __dirname,
path: path.join(__dirname, 'dist', '[name]-manifest.json')
})
]
}
然后我們需要執(zhí)行這個配置文件生成依賴文件谐檀,接下來需要使用DllReferencePlugin將依賴文件引入項目中
// webpack.conf.js
module.exports = {
// ...省略其他配置
plugins: [
new webpack.DllReferencePlugin({
context: __dirname,
// manifest 就是之前打包出來的 json 文件
manifest: require('./dist/vendor-manifest.json'),
})
]
}
代碼壓縮
在webpack3中抡谐,我們一般使用UglifyJS
來壓縮代碼,但是這個是單線程運行的桐猬,為了加快效率麦撵,我們可以webpack-parallel-uglify-plugin
來運行UglifyJS
,從而提高效率
在 Webpack4 中溃肪,我們就不需要以上這些操作了免胃,只需要將mode設置為production就可以默認開啟以上功能。代碼壓縮也是我們必做的性能優(yōu)化方案惫撰,當然我們不止可以壓縮 JS 代碼羔沙,還可以壓縮 HTML、CSS 代碼厨钻,并且在壓縮 JS 代碼的過程中扼雏,我們還可以通過配置實現比如刪除console.log這類代碼的功能坚嗜。
小的優(yōu)化點
我們可以通過小的優(yōu)化點來加快打包速度
- resolve.extensions: 用來表明文件后綴列表,默認查找順序是['.js', '.json'], 如果你的導入文件沒有添加后綴就會按照這個順序查找文件诗充。我們應該盡可能減少后綴列表長度苍蔬,然后將出現頻率高的后綴排在前面
- resolve.alias: 可以通過別名的方式來映射一個路徑,能讓webpack更快找到路徑
- module.noParse: 如果你確定一個文件下沒有其他依賴蝴蜓,就可以使用該屬性讓webpack不掃描該文件碟绑,這種方式對于大型的類庫很有幫助