Vue如何提升首屏加載速度實(shí)例解析
在Vue項(xiàng)目中,引入到工程中的所有js、css文件,編譯時(shí)都會(huì)被打包進(jìn)vendor.js,瀏覽器在加載該文件之后才能開(kāi)始顯示首屏。若是引入的庫(kù)眾多,那么vendor.js文件體積將會(huì)相當(dāng)?shù)拇螅绊懯灼恋捏w驗(yàn)。
這是優(yōu)化前的頁(yè)面加載狀態(tài):執(zhí)行npm run build打包項(xiàng)目,出來(lái)的vendeor.js文件,基本都是1M以上的的巨大文件,沒(méi)有用戶(hù)能忍受5s以上的loading而不關(guān)閉頁(yè)面的,如圖所示:
當(dāng)項(xiàng)目在掛載到服務(wù)器上,平均都是10S以上加載出來(lái),好家伙這加載時(shí)間,仿佛過(guò)了半個(gè)世紀(jì),很煩人,心態(tài)boom, 開(kāi)發(fā)者甚至都有種想砸電腦的沖動(dòng)(·#*@#¥……&*)!
我們先來(lái)分析下前端加載速度慢原因
1. 首先安裝webpack的可視化資源分析工具,命令行執(zhí)行:
npm i webpack-bundle-analyzer -D
2. 然后在webpack的dev開(kāi)發(fā)模式配置中,引入插件,代碼如下:
const BundleAnalyzerPlugin = require(’webpack-bundle-plugin’).BundleAnalyzerPluginplugins: [ new BundleAnalyzerPlugin()]
3. 最后命令行執(zhí)行npm run build --report, 瀏覽器會(huì)自動(dòng)打開(kāi)分析結(jié)果,如下所示:
可以看到vue全家桶相關(guān)依賴(lài)占用了很大的空間,對(duì)webpack的構(gòu)建速度和網(wǎng)站加載速度都會(huì)有比較大的影響。單頁(yè)應(yīng)用會(huì)隨著項(xiàng)目越大,導(dǎo)致首屏加載速度很慢,針對(duì)目前所暴露出來(lái)的問(wèn)題,有以下幾種優(yōu)化方案可以參考:
有針對(duì)性的優(yōu)化方案
一、對(duì)于第三方j(luò)s庫(kù)的優(yōu)化,分離打包
生產(chǎn)環(huán)境是內(nèi)網(wǎng)的話(huà),就把資源放內(nèi)網(wǎng),通過(guò)靜態(tài)文件引入,會(huì)比node_modules和外網(wǎng)CDN的打包加載快很多。如果有外網(wǎng)的話(huà),可以通過(guò)CDN方式引入,因?yàn)椴挥谜加迷L問(wèn)外網(wǎng)的帶寬,不僅可以為您節(jié)省流量,還能通過(guò)CDN加速,獲得更快的訪問(wèn)速度。但是要注意下,如果你引用的CDN 資源存在于第三方服務(wù)器,在安全性上并不完全可控。
目前采用引入依賴(lài)包生產(chǎn)環(huán)境的js文件方式加載,直接通過(guò)window可以訪問(wèn)暴露出的全局變量,不必通過(guò)import引入,Vue.use去注冊(cè)
在webpack的dev開(kāi)發(fā)配置文件中, 加入如下參數(shù),可以分離打包第三方資源包,key為依賴(lài)包名稱(chēng),value是源碼拋出來(lái)的全局變量。如下圖所示,可以看到打包后vue相關(guān)資源包已經(jīng)排除在外了。對(duì)于一些其他的工具庫(kù),盡量采用按需引入的方式。
externals: { vue: ’Vue’, vuex: ’Vuex’, ’vue-router’: ’VueRouter’, axios: ’axios’, ’element-ui’: ’ELEMENT’
二、vue-router使用懶加載
在訪問(wèn)到當(dāng)前頁(yè)面才會(huì)加載相關(guān)的資源,異步方式分模塊加載文件,默認(rèn)的文件名是隨機(jī)的id。如果在output中配置了chunkFilename,可以在component中添加WebpackChunkName,是為了方便調(diào)試,在頁(yè)面加載時(shí)候,會(huì)顯示加載的對(duì)應(yīng)文件名+hash值,如下圖:
{ path: ’/Login’, name: ’Login’, component: () = >import( /* webpackChunkName: 'Login' */ ’@/view/Login’)}
三、圖片資源的壓縮,icon資源使用雪碧圖
嚴(yán)格說(shuō)來(lái)這一步不算在編碼技術(shù)范圍內(nèi),但是卻對(duì)頁(yè)面的加載速度影響很大。對(duì)于所有的圖片文件,都可以在一個(gè)叫tinypng的網(wǎng)站上去壓縮一下。網(wǎng)址:tinypng.com/,對(duì)頁(yè)面上使用到的icon,可以使用在線字體圖標(biāo),或者雪碧圖,將眾多小圖標(biāo)合并到同一張圖上,用以減輕http請(qǐng)求壓力。然后通過(guò)操作CSS的background屬性,控制背景的位置以及大小,來(lái)展示需要的部分。
四、開(kāi)啟gizp壓縮
gizp壓縮是一種http請(qǐng)求優(yōu)化方式,通過(guò)減少文件體積來(lái)提高加載速度。html、js、css文件甚至json數(shù)據(jù)都可以用它壓縮,可以減小60%以上的體積。前端配置gzip壓縮,并且服務(wù)端使用nginx開(kāi)啟gzip,用來(lái)減小網(wǎng)絡(luò)傳輸?shù)牧髁看笮 ?/p>
命令行執(zhí)行:npm i compression-webpack-plugin -D
在webpack的dev開(kāi)發(fā)配置文件中加入如下代碼:
const CompressionWebpackPlugin = require(’compression-webpack-plugin’)plugins: [ new CompressionWebpackPlugin()
啟用gzip壓縮打包之后,會(huì)變成下面這樣,自動(dòng)生成gz包。目前大部分主流瀏覽器客戶(hù)端都是支持gzip的,就算小部分非主流瀏覽器不支持也不用擔(dān)心,不支持gzip格式文件的會(huì)默認(rèn)訪問(wèn)源文件的,所以不要配置清除源文件。
配置好之后,打開(kāi)瀏覽器訪問(wèn)線上,F(xiàn)12查看控制臺(tái),如果該文件資源的響應(yīng)頭里顯示有Content-Encoding: gzip,表示瀏覽器支持并且啟用了Gzip壓縮的資源
五、webpack相關(guān)配置優(yōu)化
(1)使用uglifyjs-webpack-plugin插件代替webpack自帶UglifyJsPlugin插件來(lái)壓縮JS文件;生產(chǎn)環(huán)境關(guān)閉源碼映射,一方面能減少代碼包的大小,另一方面也有利于系統(tǒng)代碼安全;清除打印日志和debugger信息;配置SplitChunks 抽取公有代碼,提升你的應(yīng)用的性能
(2)使用mini-xss-extract-plugin提取CSS 到單獨(dú)的文件, 并使用optimize-css-assets-webpack-plugin來(lái)壓縮CSS文件 。
六、前端頁(yè)面代碼層面的優(yōu)化
(1)合理使用v-if和v-show
(2)合理使用watch和computed
(3)使用v-for必須添加key, 最好為唯一id, 避免使用index, 且在同一個(gè)標(biāo)簽上,v-for不要和v-if同時(shí)使用
(4)定時(shí)器的銷(xiāo)毀。可以在beforeDestroy()生命周期內(nèi)執(zhí)行銷(xiāo)毀事件;也可以使用$once這個(gè)事件偵聽(tīng)器,在定義定時(shí)器事件的位置來(lái)清除定時(shí)器。詳細(xì)見(jiàn)vue官網(wǎng)
最終優(yōu)化后的效果如下圖:vendor.js文件從1M以上優(yōu)化到256K左右,體積減少接近80%,排除服務(wù)器影響的因素,界面渲染速度基本都在1s左右,達(dá)到秒開(kāi)效果,比之前快了太多,體驗(yàn)一下就上來(lái)了嘻嘻。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. JavaScript數(shù)據(jù)類(lèi)型對(duì)函數(shù)式編程的影響示例解析2. vue實(shí)現(xiàn)將自己網(wǎng)站(h5鏈接)分享到微信中形成小卡片的超詳細(xì)教程3. 利用CSS3新特性創(chuàng)建透明邊框三角4. div的offsetLeft與style.left區(qū)別5. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)6. CSS代碼檢查工具stylelint的使用方法詳解7. 使用css實(shí)現(xiàn)全兼容tooltip提示框8. 不要在HTML中濫用div9. html清除浮動(dòng)的6種方法示例10. 詳解CSS偽元素的妙用單標(biāo)簽之美
