webpack構(gòu)建打包的性能優(yōu)化實戰(zhàn)指南
前言
開發(fā)的時候,如果每次我們修改了文件,webpack都能很迅速地幫我們編譯完構(gòu)建完而且瀏覽器能保存狀態(tài)更新內(nèi)容,體驗會比較好;優(yōu)化產(chǎn)出代碼,減小體積,設(shè)置hash,可以提升生產(chǎn)環(huán)境上網(wǎng)頁的加載速度
一、優(yōu)化打包構(gòu)建速度,提升開發(fā)體驗和效率
1.1 優(yōu)化babel-loader
開啟緩存,只要是es6代碼沒有改動的部分,下次重新構(gòu)建的時候可以使用緩存,不被重新編譯。
rules: [
{
test: /\.js$/,
loader: ['babel-loader?cacheDirectory'],
include: srcPath, //設(shè)置include或者exclude的范圍,限定需要編譯文件的目錄范圍
//exclude: /node_modules/
}
]1.2 IgnorePlugin,避免引入無用模塊
比如有些庫包含多個國家的語言包(moment.js),我們只需要中文包或者英文報,所以我們需要避免引入不需要的語言包,
plugins: [
//忽略moment下的/locale目錄,再手動import locale內(nèi)部我們需要使用到的語言包
new webpack.IgnorePlugin(/\.\/local/,/moment/)
]1.3 noParse 避免重復(fù)模塊化解析
代碼中如果有xx.min.js之類的文件,基本已經(jīng)采用模塊化處理過的,無需在對類似文件進行遞歸解析處理,會引入進項目
module: {
noParse: [/xx\.min\.js$/]
}1.4 happyPack 多進程打包
開啟多進程打包,提高構(gòu)建速度
rules: [
{
test: /\.js$/,
//把對.js文件的處理轉(zhuǎn)交給id為babel的HappyPack實例
use: ['happypack/loader?id=babel'],
include: srcPath
}
],
plugins: [
new HappyPack({
//用唯一的標(biāo)識符id來代表當(dāng)前的HappyPack是用來處理一類特定的文件
id: 'babel',
//如何處理.js文件,用法和loader配置中一樣
loaders: ['babel-loader?cacheDirectory']
})
]1.5 ParallelUglifyPlugin多進程壓縮js
在生產(chǎn)環(huán)境中使用,因為在開發(fā)環(huán)境下沒有必要壓縮js代碼
plugins: [
new ParallelUglifyPlugin({
//還是使用的UglifyJs壓縮,只不過幫助開啟了多進程
uglifyJS: {
output: {
beautify: false,//最緊湊的輸出
comments: false,//刪除所有的注釋
},
compress: {
//刪除所有的'console'語句,可以兼容ie瀏覽器
drop_console: true,
//內(nèi)嵌定義了但只用到一次的變量
collapse_vars: true,
//提取出出現(xiàn)多次但是沒定義成變量去引用的靜態(tài)值
reduce_vars: true
}
}
})
]1.6 熱更新
改完代碼,瀏覽器無需刷新,新代碼生效,狀態(tài)保留。
entry: {
index: [
'webpack-dev-server/client?http://localhost:8080/',
'webpack/hot/dev-server',
path.join(srcPath, 'index.js')
],
other: path.join(srcPath, 'other.js')
}
plugins: [
new HotModuleReplacementPlugin()
]
devServer: {
xxx: 'xx'
hot: true //開啟熱更新
}配置完后,修改樣式,熱更新生效了,但修改js,熱更新沒有生效,接下來還需要在js中設(shè)置允許熱更新監(jiān)聽的模塊
if(module.hot){
module.hot.accept(['xxx文件名'], () => {
//在注冊了熱更新的js文件修改后,才會進行熱更新
})
}1.7 DllPlugin動態(tài)鏈接庫插件
前端框架如Vue、React,體積大,構(gòu)建慢,比較穩(wěn)定,不常升級版本。這種情況下,同一個版本只構(gòu)建一次,不用每次都重新構(gòu)建; 由于webpack已內(nèi)置DllPlugin,所以不需我們額外安裝插件,包含兩個插件 DllPlugin(用來打包出dll文件,只要打包過,就不需要再打包了),DllReferencePlugin(使用dll文件)
//webpack.dll.js文件中的配置
mode: 'development',
entry: {
//把react相關(guān)模塊放到一個單獨的動態(tài)鏈接庫
react: ['react','react-dom']
},
output: {
//輸出動態(tài)鏈接庫的文件名稱,[name]代表當(dāng)前動態(tài)鏈接庫的名稱
filename: '[name].dll.js',
path: distPath,
//存放動態(tài)鏈接庫的全局變量名稱,例如對應(yīng)react來說就是 _dll_react
//之所以在前面加上_dll_是為了防止全局變量沖突
library: '_dll_[name]'
}
plugins: [
new DllPlugin({
//動態(tài)鏈接庫的全局變量名稱,需要和output.library中保持一致
//該字段的值也就是輸出的manifest.json文件中name字段的值
name: '_dll_[name]',
path: path.join(distPath, '[name].manifest.json')
})
]配置好webpack.dll.js后,在package.json文件中定義執(zhí)行webpack.dll.js的命令
"script": {
"dll": "webpack --config build/webpack.dll.js"
}以上配置完執(zhí)行dll打包命令打包后會產(chǎn)出react.dll.js和react.manifest.json文件,需要在項目中使用到打包后的react.dll.js
//在inde.html中
<script src="./react.dll.js"></script>
//在webpack.dev.js中
plugins: [
new DllReferencePlugin({
//描述react動態(tài)鏈接庫的文件內(nèi)容
manifest: require(path.join(distPath, 'react.manifest.json'))
})
]二、webpack性能優(yōu)化-產(chǎn)出代碼
可以從體積更??;合理分包,不重復(fù)加載;速度更快、內(nèi)存使用更少這幾方面去進行優(yōu)化
- 2.1 小圖片base64編碼,使用url-loader,可減少網(wǎng)絡(luò)請求
- 2.2 bundle加hash,如果文件沒有變,hash值不變,瀏覽器可以命中緩存
- 2.3 提取公共代碼,可以是整個項目的體積更小
- 2.4 IngorePlugin 忽略庫中不需要的包
- 2.5使用cdn加速
output: {
publicPath: 'http://cdn.xxx.com'//引用文件路徑是,路徑名前加cdn域名的前綴
}打包后,將代碼放入cdn域名對應(yīng)的服務(wù)器中。
- 2.6 使用production
mode為production時,打包后的代碼會自動壓縮,Vue/React會自動刪掉調(diào)式代碼(如開發(fā)環(huán)境的warning),也會自動啟用Tree-Shaking,將未使用到的代碼刪掉
mode: "production"
- 2.7 Scope Hosting
將多個函數(shù)合并到一個函數(shù)中,可以使代碼體積更小,創(chuàng)建的函數(shù)作用域更少,代碼可讀性更好
module.exports = {
resolve: {
mainFields: ['jsnext: main','browser','main']
},
plugins: [
//開啟Scope Hosting
new ModuleConcatenationPlugin()
]
}總結(jié)
到此這篇關(guān)于webpack構(gòu)建打包的性能優(yōu)化的文章就介紹到這了,更多相關(guān)webpack構(gòu)建打包性能優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
輕松實現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼
輕松實現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼...2007-09-09
js中數(shù)組解構(gòu)與對象解構(gòu)示例代碼
數(shù)組解構(gòu)是一種在 JavaScript 中從數(shù)組中提取值并將它們分配給變量的方式,在數(shù)組解構(gòu)中分為完全解構(gòu),不完全解構(gòu),解構(gòu)失敗以及解構(gòu)默認(rèn)值,這篇文章主要介紹了js中數(shù)組解構(gòu)與對象解構(gòu),需要的朋友可以參考下2023-09-09
js實現(xiàn)鼠標(biāo)點擊左上角滑動菜單效果代碼
這篇文章主要介紹了js實現(xiàn)鼠標(biāo)點擊左上角滑動菜單效果代碼,涉及JavaScript基于鼠標(biāo)事件動態(tài)變換頁面元素樣式的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
jQuery實現(xiàn)隨意改變div任意屬性的名稱和值(部分原生js實現(xiàn))
用原生js和jQuery實現(xiàn)隨意改變div屬性和重置,在輸入框輸入“屬性名”及“屬性值”,點擊確定按鈕查看效果,感興趣的你可不要錯過了哈2013-05-05

