自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

webpack 性能優(yōu)化

開發(fā)
今天我為大家介紹一下webpack 性能優(yōu)化

開發(fā)環(huán)境性能優(yōu)化
優(yōu)化打包構(gòu)建速度

HMR優(yōu)化代碼調(diào)試source-map

生產(chǎn)環(huán)境性能優(yōu)化
優(yōu)化打包構(gòu)建速度

oneOf babel 緩存 多進(jìn)程打包 externals dll 優(yōu)化代碼運行的性能 緩存(hash,chunkhash,contenthash) tree shaking code split 懶加載和預(yù)加載 pwa

優(yōu)化 開發(fā)環(huán)境 打包構(gòu)建速度
HMR hot module replacement 熱模塊替換/模塊熱替換
作用:一個模塊發(fā)生變化,只會重新打包這一個模塊 而不是重新打包所有,極大提升構(gòu)建速度
樣式文件: 可以使用HMR功能,因為style-loader內(nèi)部實現(xiàn)了 js文件: 默認(rèn)不能使用HMR功能 -->解決:需要修改js代碼,添加支持HMR功能的代碼。注意,HMR功能對js的處理,只能處理非入口js文件的其他文件。

  1. if(module.hot){ 
  2.     //一旦module.hot是true,說明開啟HMR功能,讓HMR功能代碼生效 
  3.     module.hot.accept('./xxx.js',function(){ 
  4.         //此方法會監(jiān)聽print.js文件的變化,一旦發(fā)生變化,其他默認(rèn)不會重新打包構(gòu)建 
  5.         //會執(zhí)行后面的回調(diào)函數(shù) 
  6.         xxx(); 
  7.     }) 

html文件: 默認(rèn)不能使用HMR功能,同時會導(dǎo)致問題:html文件不能熱更新了 解決:改 entry:['入口js','html'] ,但html文件只有一個,所以不用做HMR功能

  1. devServer:{ 
  2.         //項目構(gòu)建后的目錄 
  3.         contentBase: resolve(__dirname,'build'), 
  4.         //啟用gzip壓縮 
  5.         compress:true
  6.         //端口號 
  7.         port:3000, 
  8.         //自動打開瀏覽器 
  9.         open:true 
  10.     } 

優(yōu)化 開發(fā)環(huán)境 代碼調(diào)試
source-map 一種提供源代碼到構(gòu)建后代碼映射的技術(shù)
如果構(gòu)建后代碼出錯了,通過映射可以追蹤到錯誤的代碼

  1. webpack.config.js 
  2.  
  3. devtools:'source-map' 
  4. //其他 參數(shù) [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map 
  5.  
  6. source-map : 外部 
  7.     錯誤代碼的準(zhǔn)確信息和錯誤位置 
  8. inline-source-map : 內(nèi)聯(lián) 
  9.     錯誤代碼的準(zhǔn)確信息和錯誤位置 
  10. hidden-source-map : 外部 
  11.     錯誤代碼的錯誤原因 但沒有錯誤位置,不能追蹤到源代碼的錯誤,只能提示到構(gòu)建后代碼的位置 
  12. eval-source-map : 內(nèi)聯(lián) 
  13.     每一個文件都生成對應(yīng)的source-map,都在eval 
  14.     錯誤代碼的準(zhǔn)確信息和錯誤位置 
  15. nosources-source-map : 外部 
  16.     能找到錯誤代碼的準(zhǔn)確信息 但沒有任何源代碼信息 
  17. cheap-source-map : 外部 
  18.     錯誤代碼的準(zhǔn)確信息和錯誤位置 只精確到行,不精確到列 
  19. cheap-module-source-map : 外部 
  20.     錯誤代碼的準(zhǔn)確信息和錯誤位置 
  21.     module 會將 loader 的 source-map加入 
  22. 內(nèi)聯(lián) 和 外部的區(qū)別 : 
  23.     1.外部生成了文件但內(nèi)聯(lián)沒有生成 
  24.     2.內(nèi)聯(lián)構(gòu)建速度更快 

開發(fā)環(huán)境:速度快,調(diào)試更友好

  1. 速度快 eval>inline>cheap>... 
  2. 調(diào)試更友好 souce-map>cheap-module-souce-map>cheap-souce-map 
  3. 所以 一般用eval-source-map 

生產(chǎn)環(huán)境:源代碼要不要隱藏,調(diào)試要不要友好?內(nèi)聯(lián)會讓體積編碼,所以一般不用內(nèi)聯(lián)

 

  1. nosources-source-map 隱藏源代碼 
  2. hidden-source-map 只隱藏源代碼,會提示構(gòu)建購代碼錯誤信息 
  3. --> source-map /cheap-module-souce-map 

優(yōu)化生產(chǎn)環(huán)境
oneOf
rules里中有許多個loader,這樣會導(dǎo)致每個文件都會被所有的loader過一遍,有些能處理,有些處理不了。所以可以利用oneOf達(dá)到以下loader只會匹配到第一個。但需要注意,不能有兩個loader同時處理同一個文件

  1. webpack.config 
  2. module.exports={ 
  3.     //.... 
  4.     module:{ 
  5.         rule:[ 
  6.             //正常來講,一個文件只能被一個loader處理 
  7.             //當(dāng)一個文件要被多個loader處理,那么一定要指定loader的執(zhí)行順序 
  8.             // 先執(zhí)行eslint 再執(zhí)行babel 
  9.             { 
  10.                 test:/\.js$/, 
  11.                 exclude:/node_modules/, 
  12.                 //優(yōu)先執(zhí)行 
  13.                 enforce:'pre'
  14.                 loader:'eslint-loader'
  15.                 options:{ 
  16.                     fix:true 
  17.                 } 
  18.             }, 
  19.             { 
  20.               oneOf:[ 
  21.                     { 
  22.                         test: /\.css$/, 
  23.                         use:[ 
  24.                             ...commonCssLoader 
  25.                         ] 
  26.                     }, 
  27.                     { 
  28.                         test:/\.less$/, 
  29.                         use:[ 
  30.                             ...commonCssLoader,'less-loader' 
  31.                         ] 
  32.                     }, 
  33.                     { 
  34.                         test:/\.js$/, 
  35.                         exclude:/node_modules/, 
  36.                         loader:'babel-loader'
  37.                         options:{ 
  38.                             // 預(yù)設(shè) :指示babel做怎樣的兼容性處理 
  39.                             presets:[ 
  40.                             [ 
  41.                                     '@babel/preset-env'
  42.                                     { 
  43.                                         //按需加載 
  44.                                         useBuiltIns:'usage'
  45.                                         //指定core-js版本 
  46.                                         corejs:{ 
  47.                                             version:3 
  48.                                         }, 
  49.                                         //指定兼容性做到哪個版本的瀏覽器 
  50.                                         targerts:{ 
  51.                                             chrome: '40'
  52.                                             fixfox: '50'
  53.                                             ie: '9'
  54.                                             safari: '10'
  55.                                             edge: '17' 
  56.                                         } 
  57.                                     } 
  58.                             ] 
  59.                             ] 
  60.                         } 
  61.                     }, 
  62.                     { 
  63.                         test:/\.(png|jpg|gif)/, 
  64.                         loader:'url-loader'
  65.                         enModule:true
  66.                         options:{ 
  67.                             limit:8*1024, 
  68.                             name'[hash:10].[ext]'
  69.                             outputpath:'' 
  70.                         } 
  71.                     }, 
  72.                     { 
  73.                         test:/\.html$/, 
  74.                         loader:'html-loader' 
  75.                     }, 
  76.                     { 
  77.                         exclude:/\.(js|less|css|png|jpg|gif)/, 
  78.                         loader:'file-loader'
  79.                         options:{ 
  80.                             name:'[hash:10].[ext]' 
  81.                         } 
  82.                     } 
  83.                 ] 
  84.             } 
  85.         ] 
  86.     }, 

緩存
1.babel緩存-->第二次打包更快

  1.     test:/\.js$/, 
  2.     exclude:/node_modules/, 
  3.     loader:'babel-loader'
  4.     options:{ 
  5.         // 預(yù)設(shè) :指示babel做怎樣的兼容性處理 
  6.         presets:[ 
  7.         [ 
  8.             '@babel/preset-env'
  9.             { 
  10.                 //按需加載 
  11.                 useBuiltIns:'usage'
  12.                 //指定core-js版本 
  13.                 corejs:{ 
  14.                     version:3 
  15.                 }, 
  16.                 //指定兼容性做到哪個版本的瀏覽器 
  17.                 targerts:{ 
  18.                     chrome: '40'
  19.                     fixfox: '50'
  20.                     ie: '9'
  21.                     safari: '10'
  22.                     edge: '17' 
  23.                 } 
  24.             } 
  25.         ] 
  26.         ], 
  27.         //第二次構(gòu)建時,會讀取之前的緩存 
  28.         cacheDirectory: true 
  29.         } 
  30.     }, 

2.文件資源緩存-->上線緩存優(yōu)化

  1. hash:每次webpack構(gòu)建會生成一個唯一hash值 
  2.         問題: 因為js和css同時使用一個hash值,如果重新打包,會導(dǎo)致所有緩存失效,可能我卻只改了一個文件, 
  3.     chunkhash:根據(jù)chunk生成hash值,如果打包來源于同一個chunk,那么hash值也一樣 
  4.         問題:js和css的hash值還是一樣的。 
  5.             原因:css是由js引入的,所以屬于同一個chunk 
  6.     contenthash: 根據(jù)文件內(nèi)容生成hash值, 

  1. webpack.config.js 

tree shaking
去除應(yīng)用程序中沒有使用的代碼

  1. 前提: 
  2. 1.必須使用es6模塊化 
  3. 2.開啟production模式 
  4.  
  5. 在package.json中配置 
  6. "sideEffects":false 所有代碼都沒有副作用,都可以鏡像tree sharking  
  7.     問題 可能會把css/@babel/polyfille 干掉 
  8. "sideEffects": ["*.css","*.less"] 哪些文件不 tree sharking 

code split
1.入口配置

  1. 單入口 //單頁面應(yīng)用 
  2.     entry:'./src/js/index.js'  
  3.     多入口 //多頁面應(yīng)用 
  4.     entry:{ 
  5.         index:'./src/js/index.js'
  6.         test:'./src/js/test.js' 
  7.     } 

2.optimization

  1. module.exports={ 
  2.     //... 
  3.     // 可以將nodemudules中的代碼單獨打包成一個chunk最終輸出 
  4.     // 還可以自動分析多入口chunk中,有沒有公共的文件,如果有會打包成一個單獨的chunk 
  5.     optimization:{ 
  6.         splitChunks:{ 
  7.             chunks:'all' 
  8.         } 
  9.     } 

3.import 動態(tài)導(dǎo)入語法,能將某個文件單獨打包
通過js代碼,讓某個文件被單獨打包成一個chunk,通過注釋可以固定此文件的名稱

  1. import(/*webpackChunkName: 'xxxName' */'./xx/xxx.js'
  2.     .then(res =>{ 
  3.         //加載成功 
  4.     }) 
  5.     .catch(()=>{ 
  6.         //加載失敗 
  7.     }) 

懶加載和預(yù)加載
1.懶加載 當(dāng)文件需要用時才加載
import 動態(tài)導(dǎo)入語法

  1. document.getElementById('btn').onclick = function(){ 
  2.     import(/*webpackChunkName: 'xxxName' */'./xx/ss.js'
  3.     .then(res=>{ 
  4.         //干啥干啥 
  5.     }) 

2.預(yù)加載 webpackPrefetch:true
./xx/ss.js 已經(jīng)被加載了,點擊的時候再從緩存中加載,

  1. document.getElementById('btn').onclick = function(){ 
  2.     import(/*webpackChunkName: 'xxxName',webpackPrefetch:true */'./xx/ss.js'
  3.     .then(res=>{ 
  4.         //干啥干啥 
  5.     }) 

正常加載可以認(rèn)為是并行加載(同一時間加載多個文件) 預(yù)加載prefectch 等其他資源加載完畢,瀏覽器空閑了,再偷偷加載資源 兼容性比較差 慎用
PWA 漸進(jìn)式網(wǎng)絡(luò)開發(fā)應(yīng)用程序
網(wǎng)絡(luò)離線可訪問
webbox-->webbox-webpack-plugin

  1. const WebboxWebpackPlugin = require('webbox-webpack-plugin'
  2. module.exports={ 
  3.     plugins:[ 
  4.         new WebboxWebpackPlugin.GenerateSW({ 
  5.             /* 
  6.                 1.幫助 serviceWorker 快速啟動 
  7.                 2.刪除舊的 serviceWorker  
  8.  
  9.                 生成一個 serviceWorker 配置文件 
  10.              */ 
  11.             clientsClaim:true
  12.             skipWaiting:true 
  13.         }) 
  14.     ] 
  15.  
  16. index.js 中注冊serviceworker 
  17. //處理兼容性 
  18. if('serviceWorker' in navigator){ 
  19.     window.addEventListener('load',()=>{ 
  20.         navigator.serviceWorker 
  21.             .register('./service-work.js'
  22.             .then(()=>{ 
  23.                 //成功 
  24.             }) 
  25.             .catch(()=>{ 
  26.                 //失敗 
  27.             }) 
  28.     }) 
  29.  
  30. 1.可能會出現(xiàn)問題 eslint不認(rèn)識window和navigator 
  31. 解決 package.json中eslintConfig中配置 
  32. "env":{ 
  33.     "browser":true //支持瀏覽器端的變量 
  34.  
  35. 2. sw代碼必須運行在服務(wù)器上 
  36.     -->node.js  
  37.         --> npm i serve -g  
  38.             serve -s build 啟動一個服務(wù)器將build下的資源作為靜態(tài)資源暴露出去 

多進(jìn)程打包
thread-loader 一般給babel-loader用
但需要注意
進(jìn)程啟動大約需500ms,進(jìn)程間通信也有開銷。只有工作消耗時間比較長,才需要多進(jìn)程打包

  1.     test:/\.js$/, 
  2.     exclude:/node_modules/, 
  3.     use:[ 
  4.         //'thread-loader'
  5.         { 
  6.             loader:'thread-loader'
  7.             options:{ 
  8.                 workers: 2 //進(jìn)程2個 
  9.             } 
  10.         } 
  11.         { 
  12.             loader:'babel-loader'
  13.             options:{ 
  14.                 // 預(yù)設(shè) :指示babel做怎樣的兼容性處理 
  15.                 presets:[ 
  16.                 [ 
  17.                     '@babel/preset-env'
  18.                     { 
  19.                         //按需加載 
  20.                         useBuiltIns:'usage'
  21.                         //指定core-js版本 
  22.                         corejs:{ 
  23.                             version:3 
  24.                         }, 
  25.                         //指定兼容性做到哪個版本的瀏覽器 
  26.                         targerts:{ 
  27.                             chrome: '40'
  28.                             fixfox: '50'
  29.                             ie: '9'
  30.                             safari: '10'
  31.                             edge: '17' 
  32.                         } 
  33.                     } 
  34.                 ] 
  35.                 ], 
  36.                 //第二次構(gòu)建時,會讀取之前的緩存 
  37.                 cacheDirectory: true 
  38.                 } 
  39.         } 
  40.     ] 
  41.     }, 

externals

  1. module.exports={ 
  2.     externals:{ 
  3.         //忽略/拒絕  庫名 -- npm 包名  
  4.         //可以在index.html中引入cdn 
  5.     } 

dll 動態(tài)連接
使用dll技術(shù) 對某些庫(第三方庫) 進(jìn)行單獨打包

  1. 指令 webpack --config webpack.dll.js 
  2. webpack.dll.js 
  3. const {resolve} = require('path'
  4. const webpack = require('webpack'
  5. module.exports = { 
  6.     entry:{ 
  7.         //最終打包生成的[name]-->jquery 
  8.         //['jquery']-->要打包的庫是jquery 
  9.         jquery:['jquery'
  10.     }, 
  11.     ouput:{ 
  12.         filename:'[name].js'
  13.         path:resolve(__dirname,'dll'), 
  14.         library:'[name]_[hash]' //打包的庫里面向外暴露出去的內(nèi)容叫什么名字 
  15.     }, 
  16.     plugin:[ 
  17.         new webpacl.DllPlugin({ 
  18.             //打包生成一個manifest.json --> 提供和jquery映射 
  19.             name'[name]_[hash]',//映射庫的暴露內(nèi)容名稱 
  20.             path:resolve(__dirname,'dll/manifest.json'
  21.  
  22.         }) 
  23.     ], 
  24.     mode:'production' 
  25.  
  26. webpack.config.js 
  27. const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin'
  28. module.exports={ 
  29.     plugins:[ 
  30.         //告訴webpack哪些庫不參與打包,同時名稱也得變 
  31.         new webpack.DllReferencePlugin({ 
  32.             manifest: resolve(__dirname,'dll/manifest.json'
  33.         }), 
  34.         //將某個文件打包輸出出去,并在html中引入該資源 
  35.         new AddAssetHtmlWebpackPlugin({ 
  36.             filepath:resolve(__dirname,'dll/jquery.js'
  37.         }) 
  38.     ] 

編輯推薦

 

責(zé)任編輯:姜華 來源: 晨曦大前端
相關(guān)推薦

2019-03-15 15:00:49

Webpack構(gòu)建速度前端

2021-11-09 09:57:46

Webpack 前端分包優(yōu)化

2019-03-26 10:02:16

WebpackJavascript前端

2019-03-05 10:20:49

WebWebpack分離數(shù)據(jù)

2023-04-27 08:35:20

Webpack 4性能優(yōu)化

2021-10-25 10:23:49

Webpack 前端Tree shakin

2017-07-11 15:50:11

前端webpack2優(yōu)化

2023-05-31 08:19:23

Webpack4Webpack 5

2021-09-06 06:45:06

Webpack優(yōu)化MindMaster

2021-09-27 08:16:38

Webpack 前端Cache

2021-10-12 09:52:30

Webpack 前端多進(jìn)程打包

2021-05-08 08:35:33

Webpack前端性能

2021-11-15 09:44:49

Webpack 前端 Scope Hois

2018-04-19 15:13:53

javascriptwebpackvue.js

2014-12-10 10:12:02

Web

2021-12-24 08:01:44

Webpack優(yōu)化打包

2009-09-08 09:45:23

App Engine性

2022-02-16 14:10:51

服務(wù)器性能優(yōu)化Linux

2021-11-29 11:13:45

服務(wù)器網(wǎng)絡(luò)性能

2017-08-08 09:45:43

Python性能優(yōu)化
點贊
收藏

51CTO技術(shù)棧公眾號