vue組件懶加載淺析

一严蓖、?什么是懶加載

? ? ? 懶加載也叫延遲加載,即在需要的時(shí)候進(jìn)行加載饥努,隨用隨載捡鱼。

二、為什么需要懶加載

? ? ? 在單頁(yè)應(yīng)用中酷愧,如果沒有應(yīng)用懶加載驾诈,運(yùn)用webpack打包后的文件將會(huì)異常的大,造成進(jìn)入首頁(yè)時(shí)伟墙,需要加載的內(nèi)容過多翘鸭,延時(shí)過長(zhǎng),不利于用戶體驗(yàn)戳葵,而運(yùn)用懶加載則可以將頁(yè)面進(jìn)行劃分就乓,需要的時(shí)候加載頁(yè)面,可以有效的分擔(dān)首頁(yè)所承擔(dān)的加載壓力拱烁,減少首頁(yè)加載用時(shí)

三生蚁、如何與webpack配合實(shí)現(xiàn)組件懶加載

  1、在webpack配置文件中的output路徑配置chunkFilename屬性

output: {

????????path: resolve(__dirname,?'dist'),

????????filename: options.dev ??'[name].js':?'[name].js?[chunkhash]',

????????chunkFilename:?'chunk[id].js?[chunkhash]',

????????publicPath: options.dev ??'/assets/': publicPath

????},

chunkFilename路徑將會(huì)作為組件懶加載的路徑

2戏自、配合webpack支持的異步加載方法

resolve => require([URL], resolve), 支持性好

() => system.import(URL) , webpack2官網(wǎng)上已經(jīng)聲明將逐漸廢除, 不推薦使用

() => import(URL), webpack2官網(wǎng)推薦使用, 屬于es7范疇, 需要配合babel的syntax-dynamic-import插件使用, 具體使用方法如下

npm install --save-dev babel-core babel-loader babel-plugin-syntax-dynamic-importbabel-preset-es2015

use: [{

????????loader:?'babel-loader',

????????options: {

??????????presets: [['es2015', {modules:?false}]],

??????????plugins: ['syntax-dynamic-import']

????????}

??????}]

四邦投、具體實(shí)例中實(shí)現(xiàn)懶加載

  1、路由中配置異步組件

exportdefaultnewRouter({

????routes: [

????????{

????????????mode:?'history',

????????????path:?'/my',

????????????name:?'my',

????????????component:? resolve => require(['../page/my/my.vue'], resolve),//懶加載

????????},

????]

})

2擅笔、實(shí)例中配置異步組件

components: {

????????historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懶加載

????????//historyTab: () => import('../../component/historyTab/historyTab.vue')

????},

3志衣、全局注冊(cè)異步組件

Vue.component('mideaHeader', () => {

????System.import('./component/header/header.vue')

})

五屯援、配置異步組件實(shí)現(xiàn)懶加載的問題分析

1、多次進(jìn)出同一個(gè)異步加載頁(yè)面是否會(huì)造成多次加載組件念脯?

  答:否狞洋,首次需要用到組件時(shí)瀏覽器會(huì)發(fā)送請(qǐng)求加載組件,加載完將會(huì)緩存起來(lái)绿店,以供之后再次用到該組件時(shí)調(diào)用

  2吉懊、在多個(gè)地方使用同一個(gè)異步組件時(shí)是否造成多次加載組件?如:

//a頁(yè)面

exportdefault{

????components: {

????????historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懶加載

????},

}

//b頁(yè)面

exportdefault{

????components: {

????????historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懶加載

????},

}

  答:否假勿,理由同上

  3借嗽、如果在兩個(gè)異步加載的頁(yè)面中分別同步與異步加載同一個(gè)組件時(shí)是否會(huì)造成資源重用? 如:

//a頁(yè)面import historyTab from '../../component/historyTab/historyTab.vue';

export default {

? ? components: {

? ? ? ? historyTab

? ? },

}//b頁(yè)面exportdefault {

? ? components: {

? ? ? ? historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懶加載? ? },

}

  答: 會(huì), 將會(huì)造成資源重用, 根據(jù)打包后輸出的結(jié)果來(lái)看, a頁(yè)面中會(huì)嵌入historyTab組件的代碼, b頁(yè)面中的historyTab組件還是采用異步加載的方式, 另外打包c(diǎn)hunk转培;

  解決方案: 組件開發(fā)時(shí)恶导, 如果根頁(yè)面沒有導(dǎo)入組件的情況下,而是在其他異步加載頁(yè)面中同時(shí)用到組件浸须, 那么為實(shí)現(xiàn)資源的最大利用甲锡,在協(xié)同開發(fā)的時(shí)候全部人都使用異步加載組件

  4、在異步加載頁(yè)面中載嵌入異步加載的組件時(shí)對(duì)頁(yè)面是否會(huì)有渲染延時(shí)影響羽戒?

  答:會(huì)缤沦, 異步加載的組件將會(huì)比頁(yè)面中其他元素滯后出現(xiàn), 頁(yè)面會(huì)有瞬間閃跳影響易稠;

  解決方案:因?yàn)樵谑状渭虞d組件的時(shí)候會(huì)有加載時(shí)間缸废, 出現(xiàn)頁(yè)面滯后, 所以需要合理的進(jìn)行頁(yè)面結(jié)構(gòu)設(shè)計(jì)驶社, 避免首次出現(xiàn)跳閃現(xiàn)象企量;

六、懶加載的最終實(shí)現(xiàn)方案

  1亡电、路由頁(yè)面以及路由頁(yè)面中的組件全都使用懶加載

  優(yōu)點(diǎn):(1)最大化的實(shí)現(xiàn)隨用隨載

    〗旃(2)團(tuán)隊(duì)開發(fā)不會(huì)因?yàn)闇贤▎栴}造成資源的重復(fù)浪費(fèi)

  缺點(diǎn):(1)當(dāng)一個(gè)頁(yè)面中嵌套多個(gè)組件時(shí)將發(fā)送多次的http請(qǐng)求,可能會(huì)造成網(wǎng)頁(yè)顯示過慢且渲染參差不齊的問題

2份乒、路由頁(yè)面使用懶加載恕汇, 而路由頁(yè)面中的組件按需進(jìn)行懶加載, 即如果組件不大且使用不太頻繁, 直接在路由頁(yè)面中導(dǎo)入組件, 如果組件使用較為頻繁使用懶加載

  優(yōu)點(diǎn):(1)能夠減少頁(yè)面中的http請(qǐng)求,頁(yè)面顯示效果好

  缺點(diǎn):(2)需要團(tuán)隊(duì)事先交流或辖, 在框架中分別建立懶加載組件與非懶加載組件文件夾

  3瘾英、路由頁(yè)面使用懶加載,在不特別影響首頁(yè)顯示延遲的情況下颂暇,根頁(yè)面合理導(dǎo)入復(fù)用組件缺谴,再結(jié)合方案2

  優(yōu)點(diǎn):(1)合理解決首頁(yè)延遲顯示問題

     (2)能夠最大化的減少http請(qǐng)求耳鸯, 且做其他他路由界面的顯示效果最佳

  缺點(diǎn):(1)還是需要團(tuán)隊(duì)交流湿蛔,建立合理區(qū)分各種加載方式的組件文件夾

七膀曾、采用第三種方案進(jìn)行目錄結(jié)構(gòu)設(shè)計(jì)

八、具體代碼實(shí)現(xiàn)設(shè)計(jì)

1阳啥、路由設(shè)計(jì):

import Router from 'vue-router';

import Vue from 'vue';

Vue.use(Router);

export defaultnew Router({

? ? routes: [

? ? ? ? {

? ? ? ? ? ? mode: 'history',

? ? ? ? ? ? path: '/home',

? ? ? ? ? ? name: 'home',

? ? ? ? ? ? component:? resolve => require([URL], resolve),//懶加載? ? ? ? ? ? children: [

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? mode: 'history',

? ? ? ? ? ? ? ? ? ? path: '/home/:name',

? ? ? ? ? ? ? ? ? ? name: 'any',

? ? ? ? ? ? ? ? ? ? component:? resolve => require(['../page/any/any.vue'], resolve),//懶加載? ? ? ? ? ? ? ? },

? ? ? ? ? ? ]

? ? ? ? },

? ? ? ? {

? ? ? ? ? ? mode: 'history',

? ? ? ? ? ? path: '/store',

? ? ? ? ? ? name: 'store',

? ? ? ? ? ? component:? resolve => require(['../page/store/store.vue'], resolve),//懶加載,? ? ? ? ? ? children: [

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? mode: 'history',

? ? ? ? ? ? ? ? ? ? path: '/store/:name',

? ? ? ? ? ? ? ? ? ? name: 'any',

? ? ? ? ? ? ? ? ? ? component:? resolve => require(['../page/any/any.vue'], resolve),//懶加載? ? ? ? ? ? ? ? },

? ? ? ? ? ? ]

? ? ? ? },

? ? ? ? {

? ? ? ? ? ? mode: 'history',

? ? ? ? ? ? path: '/my',

? ? ? ? ? ? name: 'my',

? ? ? ? ? ? component:? resolve => require(['../page/my/my.vue'], resolve),//懶加載,? ? ? ? ? ? children: [

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? mode: 'history',

? ? ? ? ? ? ? ? ? ? path: '/my/:name',

? ? ? ? ? ? ? ? ? ? name: 'any',

? ? ? ? ? ? ? ? ? ? component:? resolve => require(['../page/any/any.vue'], resolve),//懶加載? ? ? ? ? ? ? ? },

? ? ? ? ? ? ]

? ? ? ? },

? ? ]

})

(1)首層的路由根組件分別對(duì)應(yīng)的tab頁(yè)面

 〖酥(2)根目錄后跟著各個(gè)子路由頁(yè)面,子路由采用動(dòng)態(tài)路由配合路由的編程式導(dǎo)航再加上vuex苫纤,最優(yōu)化提高開發(fā)效率

  直接貼上代碼:

//vuex配置

importVue from?'vue';

importVuex from?'vuex';

Vue.use(Vuex);

exportdefaultnewVuex.Store({

????state: {

????????//路由組件存儲(chǔ)器

????????routers: {}

????},

????getters: {

????????routers: state => {

????????????returnstate.data;

????????}

????},

????mutations: {

????????//動(dòng)態(tài)增加路由

????????addRouter: (state, data) => {

????????????state.routers = Object.assign({}, state.routers, {

????????????????[data.name]: data.component

????????????});

????????}

????},

????actions: {

????????acMethods({commit}) {


????????}

????},

})


//根目錄中注冊(cè)路由組件

window.midea = {

????registerRouter(name, component) {

????????Store.commit('addRouter', {

????????????name: name,

????????????component: component

????????})

????}

};

//頁(yè)面使用路由導(dǎo)航

openAnyPage() {

? ? midea.registerRouter('module', resolve => {require(['../module/module.vue'], resolve)});//懶加載

? ? this.$router.push({path: '/home/module', query: {title: this.title}});

//頁(yè)面中使用動(dòng)態(tài)組件   

exportdefault{

????data () {

????????return{

????????????routeName:?'',

????????????currentRouter:?'',

????????????title:?'',

????????}

????},

????created() {

????????this.routeName =?this.$route.params.name;

????????this.title =?this.$route.query.title;

????????this.currentRouter =?this.$store.state.routers[this.routeName];

????},


????methods: {


????}

}

二、動(dòng)態(tài)組件的設(shè)計(jì)

  直接用即用即加的方式在實(shí)例或路由中直接配置異步組件

轉(zhuǎn)載至:https://www.cnblogs.com/zhanyishu/p/6587571.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纲缓,一起剝皮案震驚了整個(gè)濱河市卷拘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祝高,老刑警劉巖栗弟,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異工闺,居然都是意外死亡乍赫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門陆蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雷厂,“玉大人,你說我怎么就攤上這事叠殷「啮辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵林束,是天一觀的道長(zhǎng)像棘。 經(jīng)常有香客問我,道長(zhǎng)壶冒,這世上最難降的妖魔是什么缕题? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胖腾,結(jié)果婚禮上烟零,老公的妹妹穿的比我還像新娘。我一直安慰自己咸作,他們只是感情好瓶摆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著性宏,像睡著了一般群井。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毫胜,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天书斜,我揣著相機(jī)與錄音诬辈,去河邊找鬼。 笑死荐吉,一個(gè)胖子當(dāng)著我的面吹牛焙糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播样屠,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼穿撮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了痪欲?” 一聲冷哼從身側(cè)響起悦穿,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎业踢,沒想到半個(gè)月后栗柒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡知举,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年瞬沦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇锡。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逛钻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锰提,到底是詐尸還是另有隱情绣的,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布欲账,位于F島的核電站屡江,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赛不。R本人自食惡果不足惜惩嘉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踢故。 院中可真熱鬧文黎,春花似錦、人聲如沸殿较。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淋纲。三九已至劳闹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背本涕。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工业汰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菩颖。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓样漆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晦闰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子放祟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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