webpack構(gòu)建打包的性能優(yōu)化實(shí)戰(zhàn)指南
前言
開發(fā)的時(shí)候,如果每次我們修改了文件,webpack都能很迅速地幫我們編譯完構(gòu)建完而且瀏覽器能保存狀態(tài)更新內(nèi)容,體驗(yàn)會(huì)比較好;優(yōu)化產(chǎn)出代碼,減小體積,設(shè)置hash,可以提升生產(chǎn)環(huán)境上網(wǎng)頁的加載速度
一、優(yōu)化打包構(gòu)建速度,提升開發(fā)體驗(yàn)和效率
1.1 優(yōu)化babel-loader
開啟緩存,只要是es6代碼沒有改動(dòng)的部分,下次重新構(gòu)建的時(shí)候可以使用緩存,不被重新編譯。
rules: [
{
test: /\.js$/,
loader: ['babel-loader?cacheDirectory'],
include: srcPath, //設(shè)置include或者exclude的范圍,限定需要編譯文件的目錄范圍
//exclude: /node_modules/
}
]1.2 IgnorePlugin,避免引入無用模塊
比如有些庫包含多個(gè)國家的語言包(moment.js),我們只需要中文包或者英文報(bào),所以我們需要避免引入不需要的語言包,
plugins: [
//忽略moment下的/locale目錄,再手動(dòng)import locale內(nèi)部我們需要使用到的語言包
new webpack.IgnorePlugin(/\.\/local/,/moment/)
]1.3 noParse 避免重復(fù)模塊化解析
代碼中如果有xx.min.js之類的文件,基本已經(jīng)采用模塊化處理過的,無需在對(duì)類似文件進(jìn)行遞歸解析處理,會(huì)引入進(jìn)項(xiàng)目
module: {
noParse: [/xx\.min\.js$/]
}1.4 happyPack 多進(jìn)程打包
開啟多進(jìn)程打包,提高構(gòu)建速度
rules: [
{
test: /\.js$/,
//把對(duì).js文件的處理轉(zhuǎn)交給id為babel的HappyPack實(shí)例
use: ['happypack/loader?id=babel'],
include: srcPath
}
],
plugins: [
new HappyPack({
//用唯一的標(biāo)識(shí)符id來代表當(dāng)前的HappyPack是用來處理一類特定的文件
id: 'babel',
//如何處理.js文件,用法和loader配置中一樣
loaders: ['babel-loader?cacheDirectory']
})
]1.5 ParallelUglifyPlugin多進(jìn)程壓縮js
在生產(chǎn)環(huán)境中使用,因?yàn)樵陂_發(fā)環(huán)境下沒有必要壓縮js代碼
plugins: [
new ParallelUglifyPlugin({
//還是使用的UglifyJs壓縮,只不過幫助開啟了多進(jìn)程
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文件名'], () => {
//在注冊(cè)了熱更新的js文件修改后,才會(huì)進(jìn)行熱更新
})
}1.7 DllPlugin動(dòng)態(tài)鏈接庫插件
前端框架如Vue、React,體積大,構(gòu)建慢,比較穩(wěn)定,不常升級(jí)版本。這種情況下,同一個(gè)版本只構(gòu)建一次,不用每次都重新構(gòu)建; 由于webpack已內(nèi)置DllPlugin,所以不需我們額外安裝插件,包含兩個(gè)插件 DllPlugin(用來打包出dll文件,只要打包過,就不需要再打包了),DllReferencePlugin(使用dll文件)
//webpack.dll.js文件中的配置
mode: 'development',
entry: {
//把react相關(guān)模塊放到一個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫
react: ['react','react-dom']
},
output: {
//輸出動(dòng)態(tài)鏈接庫的文件名稱,[name]代表當(dāng)前動(dòng)態(tài)鏈接庫的名稱
filename: '[name].dll.js',
path: distPath,
//存放動(dòng)態(tài)鏈接庫的全局變量名稱,例如對(duì)應(yīng)react來說就是 _dll_react
//之所以在前面加上_dll_是為了防止全局變量沖突
library: '_dll_[name]'
}
plugins: [
new DllPlugin({
//動(dòng)態(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打包命令打包后會(huì)產(chǎn)出react.dll.js和react.manifest.json文件,需要在項(xiàng)目中使用到打包后的react.dll.js
//在inde.html中
<script src="./react.dll.js"></script>
//在webpack.dev.js中
plugins: [
new DllReferencePlugin({
//描述react動(dòng)態(tài)鏈接庫的文件內(nèi)容
manifest: require(path.join(distPath, 'react.manifest.json'))
})
]二、webpack性能優(yōu)化-產(chǎn)出代碼
可以從體積更??;合理分包,不重復(fù)加載;速度更快、內(nèi)存使用更少這幾方面去進(jìn)行優(yōu)化
- 2.1 小圖片base64編碼,使用url-loader,可減少網(wǎng)絡(luò)請(qǐng)求
- 2.2 bundle加hash,如果文件沒有變,hash值不變,瀏覽器可以命中緩存
- 2.3 提取公共代碼,可以是整個(gè)項(xiàng)目的體積更小
- 2.4 IngorePlugin 忽略庫中不需要的包
- 2.5使用cdn加速
output: {
publicPath: 'http://cdn.xxx.com'//引用文件路徑是,路徑名前加cdn域名的前綴
}打包后,將代碼放入cdn域名對(duì)應(yīng)的服務(wù)器中。
- 2.6 使用production
mode為production時(shí),打包后的代碼會(huì)自動(dòng)壓縮,Vue/React會(huì)自動(dòng)刪掉調(diào)式代碼(如開發(fā)環(huán)境的warning),也會(huì)自動(dòng)啟用Tree-Shaking,將未使用到的代碼刪掉
mode: "production"
- 2.7 Scope Hosting
將多個(gè)函數(shù)合并到一個(gè)函數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript this指向相關(guān)問題及改變方法
這篇文章主要介紹了javascript this指向相關(guān)問題及改變方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Echarts基本用法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Echarts基本用法,詳解的介紹了Echarts的基本用法和實(shí)例,有興趣的可以了解一下2017-08-08
原生javascript自定義input[type=radio]效果示例
這篇文章主要介紹了原生javascript自定義input[type=radio]效果,結(jié)合實(shí)例形式分析了javascript模擬form表單中radio效果的相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
IE autocomplete internet explorer''s autocomplete
IE autocomplete internet explorer''s autocomplete...2007-06-06
判斷JavaScript對(duì)象是否可用的最正確方法分析
在調(diào)試JavaScript的過程中,你是不是經(jīng)常會(huì)遇到object undefined的問題呢?你平時(shí)是怎樣來測(cè)試對(duì)象是否存在呢?判斷瀏覽器版本?判斷JavaScript版本?本文來告訴你正確的方法。這篇文章涉及的瀏覽器可能古老一些,但是闡述的道理確實(shí)適合現(xiàn)在使用的。2008-10-10
JavaScript程序員應(yīng)該知道的45個(gè)實(shí)用技巧
在這篇文章中,我將分享一組JavaScript的技巧、竅門和最佳實(shí)踐,這些都是JavaScript程序員應(yīng)該知曉的,不管他們是使用在瀏覽器/引擎上,還是服務(wù)器端(SSJS——Service Side JavaScript)JavaScript解釋器上2014-03-03
javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例
這篇文章主要介紹了javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

