vue路由懶加載的原理

學(xué)習(xí)Vue的時(shí)候,各類(lèi)教程都會(huì)告訴我們:Vue 的特點(diǎn)是SPA——Single Page Application(單頁(yè)應(yīng)用程序)。
它有著諸如:“只有第一次會(huì)加載頁(yè)面, 以后的每次頁(yè)面切換,只需要進(jìn)行組件替換;減少了請(qǐng)求體積,加快頁(yè)面響應(yīng)速度,降低了對(duì)服務(wù)器的壓力” 等等優(yōu)點(diǎn)。
但是呢!因?yàn)閂ue 是SPA,所以首頁(yè)第一次加載時(shí)會(huì)把所有的組件以及組件相關(guān)的資源全都加載了。
這樣就會(huì)導(dǎo)致首頁(yè)加載時(shí)加載了許多首頁(yè)用不上的資源,造成網(wǎng)站首頁(yè)打開(kāi)速度變慢的問(wèn)題,降低用戶(hù)體驗(yàn)。
為了解決上面問(wèn)題,我們需要對(duì)Vue實(shí)現(xiàn)組件懶加載(按需加載)。

而vue中的路由懶加載其實(shí)是利用了webpack的異步加載的方法。

我們都知道webpack會(huì)整合所有的資源,將其打入一個(gè)包內(nèi)。但是要實(shí)現(xiàn)懶加載,我們肯定不能讓子組件被整合進(jìn)一個(gè)包里頭。所以需要解決的問(wèn)題就是如何將子組件單獨(dú)打包成一個(gè)文件,在我們需要用到他的時(shí)候去加載。

首先解決第一個(gè)問(wèn)題,如何將子組件打包成一個(gè)單獨(dú)的文件。

在webpack中提供了一個(gè)import方法給我們,注意是方法,而不是我們經(jīng)常使用的那個(gè)import。

正常的引入文件我們會(huì)這樣做

import {sum} from './js/count'  //同步加載

而這樣的寫(xiě)法就是大家所說(shuō)的同步引入,他是會(huì)被打進(jìn)一個(gè)文件內(nèi)的。
使用import方法,就可以做到異步引入,從而使被引入的文件單獨(dú)被打包

import(/* webpackChunkName: "count" */  './js/count')

這樣就會(huì)使這個(gè)count.js被單獨(dú)打包成一個(gè)文件了


image.png

被單獨(dú)打包的文件默認(rèn)會(huì)使用文件的路徑作為文件名。

/* webpackChunkName: "count" */這一行注釋就是為了修改打包出來(lái)的文件名的 count就是文件名。
在webpack配置中我們還需要這樣寫(xiě)

    output: {
        //所有文件的輸出路徑
        //__dirname: nodejs的變量,代表當(dāng)前文件的文件夾目錄
        path: path.resolve(__dirname, "dist"),//絕對(duì)路徑
        //文件名
        filename: "bundle.js",
        //代碼塊的文件名
        chunkFilename:"[name].chunk.js",  這里的name就是上面的webpackChunkName
        clean:true //自動(dòng)刪除上次打包的結(jié)果
    },

這樣我們就實(shí)現(xiàn)了一個(gè)將文件單獨(dú)打包的功能。

當(dāng)然離懶加載還差一點(diǎn)。
雖然上文中我們做到了異步加載,并且也將文件單獨(dú)打包了,但是如果單純這樣做的話資源還是會(huì)被一起加載。細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)了,在vue中我們通常會(huì)給需要懶加載的路由這樣寫(xiě)

() => import(/* webpackChunkName: "con" */ './xxx.vue')

沒(méi)錯(cuò),這里就是利用了函數(shù)只有被調(diào)用才會(huì)執(zhí)行的特性。將組件的component屬性賦值一個(gè)函數(shù),在函數(shù)中去異步引入組件。這樣才是一個(gè)完整的路由懶加載方案。

了解了這個(gè)之后其實(shí)就可以利用懶加載去對(duì)項(xiàng)目做很多優(yōu)化了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容