Vue CLI 2&3 下的項目優(yōu)化實踐:CDN + Gzip + Prerender

項目越做越大剧蹂,到底項目打包完部署到服務(wù)器上訪問加載速度很慢爆安,本文就是為了解決這個問題氢烘。有更好的解決方案歡迎大家留言怀偷。我會及時更新文檔。

前言

但隨著項目越做越大威始,依賴的第三方 npm 包越來越多枢纠,構(gòu)建之后的文件也會越來越大。
尤其是 vendor.js, 甚至?xí)_(dá)到 2M 左右黎棠。再加上又是單頁應(yīng)用晋渺,這就會導(dǎo)致在網(wǎng)速較慢或者服務(wù)器帶寬有限的情況出現(xiàn)長時間的白屏。
為了解決這個問題脓斩,我做了一些探索木西,在幾乎不需要改動業(yè)務(wù)代碼的情況下。

找到了三種有明顯效果的優(yōu)化方案

  • 一随静、CDN
  • 二八千、Gzip
  • 三、Prerender

一燎猛、首先考慮CDN 優(yōu)化(簡單粗暴)

構(gòu)建后文件說明

1.app.css: 壓縮合并后的樣式文件恋捆。
2.app.js:主要包含項目中的 App.vue、main.js重绷、router沸停、store 等業(yè)務(wù)代碼。
3.vendor.js:主要包含項目依賴的諸如 vuex昭卓,axios 等第三方庫的源碼愤钾,這也是為什么這個文件如此之大的原因瘟滨,下一步將探索如何優(yōu)化這一塊,畢竟隨著項目的開發(fā)能颁,依賴的庫也能會越來越多杂瘸。
4.mainfest.js:mainfest 的英文有清單、名單的意思伙菊,該文件包含了加載和處理路由模塊的邏輯败玉。

項目加載發(fā)現(xiàn)這兩個文件較大,采用cdn優(yōu)化
  • 1 镜硕、 將依賴的 vue绒怨、vue-router、vuex谦疾、element-ui 和 axios 這五個庫南蹂,全部改為通過 CDN 鏈接獲取,在index.html 里插入 js 和 css 的 BootCDN免費(fèi)網(wǎng)址鏈接念恍。
    <script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
    <script src="https://cdn.bootcss.com/vue-router/2.7.0/vue-router.min.js"></script>
    <script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>
    <link rel="stylesheet" >
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script src="https://cdn.bootcss.com/vuex/3.0.1/vuex.js"></script>
  • 2六剥、 添加webpack.config.js配置文件
  externals:{
    'vue-router': 'VueRouter',
    'vue': 'Vue',
    'axios': 'axios',
    'element-ui': 'ELEMENT',
    'vuex': 'Vuex',
  },

-3、 卸載依賴的 npm 包峰伙,npm uninstall axios element-ui vue vue-router vuex疗疟;
-4、刪除main文件里之前的引包方式

// import Vue from 'vue'
// import ElementUI from 'element-ui'
// import 'element-ui/lib/theme-chalk/index.css'
// import VueRouter from 'vue-router'

import App from './App.vue'
import routes from './router'
import utils from './utils/Utils'
import echarts from 'echarts'


Vue.use(ELEMENT)
Vue.use(VueRouter)

Vue.prototype.$http = utils.httpInit();
Vue.prototype.$WebSocket = utils.webSocketInit;
Vue.prototype.$echarts = echarts;
const router = new VueRouter({
  // mode: 'history',
  mode: 'hash',    //路由的模式
  routes
})

new Vue({
  router,
  el: '#app',
  render: h => h(App)
})


優(yōu)化前:

優(yōu)化后:

發(fā)現(xiàn)vendor這個文件只有144bytes瞳氓,index

文件 優(yōu)化前 優(yōu)化后
vendor.js 1.52M 144bytes
index.js 5.29M 3.86M

二策彤、Gzip 優(yōu)化

使用 Gzip 兩個明顯的好處,一是可以減少存儲空間匣摘,二是通過網(wǎng)絡(luò)傳輸文件時店诗,可以減少傳輸?shù)臅r間。
1.如何開啟 gzip 壓縮
開啟 gzip 的方式主要是通過修改服務(wù)器配置音榜,以 nginx 服務(wù)器為例庞瘸。
下圖是使用同一套代碼,在僅改變服務(wù)器的 gzip 開關(guān)狀態(tài)的情況下的 Network 對比圖:

未開啟 gzip 壓縮:

開啟 gzip 壓縮:

開啟 gzip 壓縮后的響應(yīng)頭:

從上圖可以明顯看出開啟 gzip 前后赠叼,文件大小有三四倍的差距擦囊,加載速度也從原來的 7 秒多,提升到 3 秒多嘴办。

附上 nginx 的配置方式:

http {
  gzip on;
  gzip_static on;
  gzip_min_length 1024;
  gzip_buffers 4 16k;
  gzip_comp_level 2;
  gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
  gzip_vary off;
  gzip_disable "MSIE [1-6]\.";
}

我們都知道config/index.js里有一個productionGzip的選項瞬场,那么它是做什么用的?

我們嘗試執(zhí)行npm install --save-dev compression-webpack-plugin@1.x, 并把productionGzip設(shè)置為true涧郊,重新build贯被,放在 nginx 服務(wù)器下,看看有什么區(qū)別:

我們會發(fā)現(xiàn)構(gòu)建之后的文件多了一些 js.gz 和 css.gz 的文件,而且 vendor.js 變得更小了刃榨。

這其實是因為我們開啟了 nginx 的 gzip_static on; 選項,如果 gzip_static 設(shè)置為 on, 那么就會使用同名的.gz 文件双仍,不會占用服務(wù)器的 CPU 資源去壓縮枢希。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市朱沃,隨后出現(xiàn)的幾起案子苞轿,更是在濱河造成了極大的恐慌,老刑警劉巖逗物,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搬卒,死亡現(xiàn)場離奇詭異,居然都是意外死亡翎卓,警方通過查閱死者的電腦和手機(jī)契邀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來失暴,“玉大人坯门,你說我怎么就攤上這事《喊牵” “怎么了古戴?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矩肩。 經(jīng)常有香客問我现恼,道長,這世上最難降的妖魔是什么黍檩? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任叉袍,我火速辦了婚禮,結(jié)果婚禮上刽酱,老公的妹妹穿的比我還像新娘畦韭。我一直安慰自己,他們只是感情好肛跌,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布艺配。 她就那樣靜靜地躺著,像睡著了一般衍慎。 火紅的嫁衣襯著肌膚如雪转唉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天稳捆,我揣著相機(jī)與錄音赠法,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛砖织,可吹牛的內(nèi)容都是我干的款侵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼侧纯,長吁一口氣:“原來是場噩夢啊……” “哼新锈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眶熬,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤妹笆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娜氏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拳缠,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年贸弥,在試婚紗的時候發(fā)現(xiàn)自己被綠了窟坐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡绵疲,死狀恐怖狸涌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情最岗,我是刑警寧澤帕胆,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站般渡,受9級特大地震影響懒豹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驯用,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一脸秽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝴乔,春花似錦记餐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挖腰,卻和暖如春雕沿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猴仑。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工审轮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓疾渣,卻偏偏與公主長得像篡诽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子榴捡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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

  • 內(nèi)容 UI組件 開發(fā)框架 實用庫 服務(wù)端 輔助工具 應(yīng)用實例 Demo示例 UI組件 element ★13489...
    前端來入坑閱讀 3,524評論 0 31
  • 夜薄疚,終于徹徹底底夜了 在戰(zhàn)勝白天 與黃昏分離 輾轉(zhuǎn)反側(cè)之后 夜,終于徹徹底底夜了 如果不是因為那支煙 如果不是因為那首歌
    玩主楊笑閱讀 114評論 0 1
  • 文/ 小婷半清 已經(jīng)一年了,夢清沉溺在過去躏筏,把自己緊緊包裹板丽,整日呆在屋子里,誰都靠近不得趁尼。連父母都勸說不動埃碱,愛情沒...
    小婷半清閱讀 2,621評論 106 104
  • 民哥分享了一個設(shè)計師做公眾號的案例,他不是為了獲得利益才去做公眾號酥泞,只是為了單純的為了電商圈的視覺提升砚殿,結(jié)果除了個...
    空靈188閱讀 111評論 0 1