webpack構(gòu)建打包的性能優(yōu)化實(shí)戰(zhàn)指南
前言
開發(fā)的時(shí)候,如果每次我們修改了文件,webpack都能很迅速地幫我們編譯完構(gòu)建完而且瀏覽器能保存狀態(tài)更新內(nèi)容,體驗(yàn)會比較好;優(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代碼沒有改動的部分,下次重新構(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目錄,再手動import locale內(nèi)部我們需要使用到的語言包 new webpack.IgnorePlugin(/\.\/local/,/moment/) ]
1.3 noParse 避免重復(fù)模塊化解析
代碼中如果有xx.min.js之類的文件,基本已經(jīng)采用模塊化處理過的,無需在對類似文件進(jìn)行遞歸解析處理,會引入進(jìn)項(xiàng)目
module: { noParse: [/xx\.min\.js$/] }
1.4 happyPack 多進(jìn)程打包
開啟多進(jìn)程打包,提高構(gòu)建速度
rules: [ { test: /\.js$/, //把對.js文件的處理轉(zhuǎn)交給id為babel的HappyPack實(shí)例 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多進(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文件名'], () => { //在注冊了熱更新的js文件修改后,才會進(jìn)行熱更新 }) }
1.7 DllPlugin動態(tài)鏈接庫插件
前端框架如Vue、React,體積大,構(gòu)建慢,比較穩(wěn)定,不常升級版本。這種情況下,同一個(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ú)的動態(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文件,需要在項(xiàng)目中使用到打包后的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)存使用更少這幾方面去進(jìn)行優(yōu)化
- 2.1 小圖片base64編碼,使用url-loader,可減少網(wǎng)絡(luò)請求
- 2.2 bundle加hash,如果文件沒有變,hash值不變,瀏覽器可以命中緩存
- 2.3 提取公共代碼,可以是整個(gè)項(xiàng)目的體積更小
- 2.4 IngorePlugin 忽略庫中不需要的包
- 2.5使用cdn加速
output: { publicPath: 'http://cdn.xxx.com'//引用文件路徑是,路徑名前加cdn域名的前綴 }
打包后,將代碼放入cdn域名對應(yīng)的服務(wù)器中。
- 2.6 使用production
mode為production時(shí),打包后的代碼會自動壓縮,Vue/React會自動刪掉調(diào)式代碼(如開發(fā)環(huán)境的warning),也會自動啟用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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript this指向相關(guān)問題及改變方法
這篇文章主要介紹了javascript this指向相關(guān)問題及改變方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Echarts基本用法_動力節(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-08IE autocomplete internet explorer''s autocomplete
IE autocomplete internet explorer''s autocomplete...2007-06-06JavaScript程序員應(yīng)該知道的45個(gè)實(shí)用技巧
在這篇文章中,我將分享一組JavaScript的技巧、竅門和最佳實(shí)踐,這些都是JavaScript程序員應(yīng)該知曉的,不管他們是使用在瀏覽器/引擎上,還是服務(wù)器端(SSJS——Service Side JavaScript)JavaScript解釋器上2014-03-03javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例
這篇文章主要介紹了javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08