vue項(xiàng)目性能優(yōu)化

一、 使用webpack-bundle-analyzer 分析打包后的生成的文件結(jié)構(gòu)進(jìn)行優(yōu)化胳泉;

在package.json配置 "analyz": "NODE_ENV=production npm_config_report=true npm run build" 蒜撮,然后運(yùn)行 npm run analyz 即可晴氨;

image.png
image.png

通過(guò)分析圖艘绍,可以查看哪些有重復(fù)的文件或者哪個(gè)文件較大從而相應(yīng)的進(jìn)行優(yōu)化晦雨;

這里提一下侥猩,左上角的stat榔至、parsed及gzip表示什么意思:
stat表示文件的輸入大小,parsed表示文件的輸出大小欺劳,gzip表示通過(guò)gzip壓縮運(yùn)行解析的包/模塊的大羞笕 ;https://github.com/webpack-contrib/webpack-bundle-analyzer#size-definitions
這三個(gè)狀態(tài)文件體積相差很大划提,可見(jiàn)使用gzip的重要性枫弟。

二、啟用 gzip壓縮鹏往;

1淡诗、安裝 compression-webpack-plugin

npm install compression-webpack-plugin --save-dev
這里有個(gè)坑,就是如果你的vue版本為2.5.2 及以下 webpack版本為3.6.0及以下時(shí)韩容,建議安裝compression-webpack-plugin的版本為1.0.0-beta.1 而不是2.0.0款违,否則可能打包時(shí)會(huì)報(bào)

ValidationError: Compression Plugin Invalid Options

options should NOT have additional properties
2、將vue項(xiàng)目中的 config/index.js中productionGzip: false改為 productionGzip: true群凶;

打包后插爹,可以看到.gz后綴文件了:


image.png
3、然后后臺(tái)開(kāi)啟gzip模式:

開(kāi)啟 nginx gzip ,在 nginx.conf 配置文件中 配置

http {  //在 http中配置如下代碼请梢,
  
   gzip on;
   gzip_disable "msie6"; 
   gzip_vary on; 
   gzip_proxied any;
   gzip_comp_level 8; #壓縮級(jí)別
   gzip_buffers 16 8k;
   #gzip_http_version 1.1;
   gzip_min_length 100; #不壓縮臨界值
   gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
 }

保存退出 赠尾,并 重啟 nginx

 systemctl reload nginx.service  
 systemctl restart nginx.service
4、測(cè)試訪問(wèn)

a毅弧、未開(kāi)啟gzip的情況


未開(kāi)啟gzip的情況
未開(kāi)啟gzip的體積

b气嫁、開(kāi)啟gzip的情況


開(kāi)啟了gzip的情況

開(kāi)啟了gzip的體積

可以看到 開(kāi)啟后響應(yīng)頭里有 content-encoding: gzip,且體積減少了一半還多形真。

三杉编、解決vendor.js體積過(guò)大的問(wèn)題

上面我們可以看到未經(jīng)過(guò)gzip壓縮,vendor.js體積有730kb咆霜,體積挺大的邓馒,vendor.js是第三方庫(kù)經(jīng)webpack打包而生成的集合;如下面的main.js 引用的第三方庫(kù)ElementUI 蛾坯、axios會(huì)被打包在vendor.js中


image.png

其實(shí) 我們可以使用cdn來(lái)引入第三方庫(kù):

1光酣、選用cdn服務(wù)商

如 選用unpkg來(lái)作為第三方提供 https://unpkg.com 或者 https://www.bootcdn.cn/ 如我想要axios包則輸入網(wǎng)址為 https://unpkg.com/axios/ (末尾加斜杠代表你要查詢(xún)?cè)搸?kù)的所有版本列表)

2、在index.html中將你所需的第三方庫(kù)的鏈接加入即可:

我以axios為例:


image.png

注:應(yīng)該加入到<div id="app"></div>前面

3脉课、啟用DNS預(yù)解析

在index.html的header中加入

  <meta http-equiv="x-dns-prefetch-control" content="on">
  <link rel="dns-prefetch" href="cdn域名">
  <meta http-equiv="x-dns-prefetch-control" content="on">
  <link rel="dns-prefetch" >
4救军、webpack.base.conf 中添加 externals 來(lái)告訴webpack我們這些第三方庫(kù)不需要打包
image.png
  externals:{
    "axios":"axios"  // key--axios 為你在項(xiàng)目中使用的名字,value--axios 為axios庫(kù)的模塊名為axios
  },

庫(kù)的模塊名可以在源碼中看倘零,如element-ui 則為ELEMENT


image.png
5唱遭、去除原有的引用

包括 import axios from 'axios';Vue.use(axios )
,當(dāng)然如果為了避免去除import axios from 'axios';后導(dǎo)致很多eslint 警告呈驶,你可以保留import axios from 'axios';拷泽; 參考依據(jù): 外部擴(kuò)展(externals)

https://webpack.js.org/configuration/externals/

完成后打包一下觀察vendor.js的體積變化:

未使用cdn的情況
使用cdn以后

可以看到vendor.js減少了12kb;也就是axios.min.js的大小袖瞻。這里其實(shí)還可以將vue司致、element ui 都拎出來(lái),可以減少很多體積聋迎;

題外話(huà):

a脂矫、app.js
app.js 入口文件打包的結(jié)果,里面將項(xiàng)目中的api接口名及請(qǐng)求和響應(yīng)等攔截器霉晕、路由組件關(guān)系等文件全部壓縮打包了庭再,大部分為我們自己編寫(xiě)的代碼

b捞奕、manifest.js
manifest.js 模塊化的應(yīng)用程序的所有代碼,里面是 建立hash映射關(guān)系的文件


image.png

c佩微、vendor.js 第三方庫(kù)缝彬,一般是node_modules里面的依賴(lài)進(jìn)行打包

d、vendor-async.js
vue中mixin里的所有代碼都會(huì)打包至vendor-async.js中

四哺眯、采用webpack.DllReferencePlugin將不常變更的庫(kù)免二次打包編譯;

這個(gè)可大大減少編譯時(shí)間扒俯,同時(shí)可使用未變更的文件的緩存奶卓;
具體可參考
1、 Webpack的dll功能
2撼玄、webpack進(jìn)階——DllPlugin優(yōu)化打包性能(基于vue-cli)

其實(shí)采用webpack.DllReferencePlugin跟上面介紹的--解決vendor體積過(guò)大的問(wèn)題中的 externals方法存在異曲同工之處夺姑,貌似它們間有差別,但這個(gè)差別有待考證:


image.png

經(jīng)過(guò)查看的回答發(fā)現(xiàn)webpack.DllReferencePlugin可以由autodll-webpack-plugin完美替代,這點(diǎn)待后面有時(shí)間再研究掌猛;

五盏浙、路由懶加載

使用

// 官方寫(xiě)法
const CardActConsume = () => import('@/components/club/CardActConsume')
// 自己的寫(xiě)法
const CardBuyConsume = (resolve) => {
  import('@/components/club/CardBuyConsume').then((module) => {
    resolve(module)
   });
 }
...
    {
          path: '/club/:id/cardactconsume',
          name: 'clubcardactconsume',
          component: CardActConsume,
   }
...


替代原有的

import CardActConsume from '@/components/club/CardBuyConsume'

這個(gè)就不多說(shuō)了 ,可見(jiàn)官方文檔: https://router.vuejs.org/zh/guide/advanced/lazy-loading.html#%E6%8A%8A%E7%BB%84%E4%BB%B6%E6%8C%89%E7%BB%84%E5%88%86%E5%9D%97荔茬;另外可以把組件按組分塊打包成一個(gè)js:

image.png

六废膘、webpack 配置文件記得區(qū)分開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境

生產(chǎn)環(huán)境不要包含HotModuleReplacementPlugin 等沒(méi)有必要的插件;

七慕蔚、提升服務(wù)器帶寬

如果條件運(yùn)行丐黄,跟運(yùn)維說(shuō)下讓其提升web頁(yè)面的帶寬。ps:如果帶寬為1M/s孔飒,說(shuō)明太帶寬設(shè)置的太小了灌闺,可以設(shè)置5M/s及以上。ps:我們是10M/s

八坏瞄、如果使用了cdn桂对,可以參考購(gòu)買(mǎi)的cdn服務(wù)商的說(shuō)明

這里以阿里云為例:
1、性能優(yōu)化概述
2鸠匀、提高CDN緩存命中率

九蕉斜、推薦文章集合

https://web.dev/fast/

推薦資料:
1、https://webpack.docschina.org/guides/lazy-loading/
2狮崩、 vue-cli中的webpack配置

參考資料:
1蛛勉、完美解決 vue webpack 單頁(yè)面 加載慢 gzip 訪問(wèn) vendor.js 打包文件過(guò)大問(wèn)題
2、 使用vue-cli生成的vendor.js文件太大睦柴,有辦法減少體積嗎诽凌?
3、[https://juejin.im/post/5a291092518825293b50366d#heading-2](VueSPA 首屏加載優(yōu)化實(shí)踐)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坦敌,一起剝皮案震驚了整個(gè)濱河市侣诵,隨后出現(xiàn)的幾起案子痢法,更是在濱河造成了極大的恐慌,老刑警劉巖杜顺,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件财搁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡躬络,警方通過(guò)查閱死者的電腦和手機(jī)尖奔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)穷当,“玉大人提茁,你說(shuō)我怎么就攤上這事∧俨耍” “怎么了茴扁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汪疮。 經(jīng)常有香客問(wèn)我峭火,道長(zhǎng),這世上最難降的妖魔是什么智嚷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任卖丸,我火速辦了婚禮,結(jié)果婚禮上纤勒,老公的妹妹穿的比我還像新娘坯苹。我一直安慰自己,他們只是感情好摇天,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布粹湃。 她就那樣靜靜地躺著,像睡著了一般泉坐。 火紅的嫁衣襯著肌膚如雪为鳄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天腕让,我揣著相機(jī)與錄音孤钦,去河邊找鬼。 笑死纯丸,一個(gè)胖子當(dāng)著我的面吹牛偏形,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觉鼻,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俊扭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坠陈?” 一聲冷哼從身側(cè)響起萨惑,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捐康,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后庸蔼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體解总,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年姐仅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了花枫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萍嬉,死狀恐怖乌昔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壤追,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布供屉,位于F島的核電站行冰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伶丐。R本人自食惡果不足惜悼做,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哗魂。 院中可真熱鬧肛走,春花似錦、人聲如沸录别。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)组题。三九已至葫男,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崔列,已是汗流浹背梢褐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赵讯,地道東北人盈咳。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像边翼,于是被迫代替她去往敵國(guó)和親鱼响。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容