Vue.js路由懶加載[譯]

作者:Joshua Bemenderfer
原文地址: lazy-loading-routes
譯者:jeneser

當(dāng)你的SPA(單頁應(yīng)用程序)變得復(fù)雜時,打包構(gòu)建后的Javascript包會變得非常大,以至于嚴(yán)重影響頁面的加載時間。幸運的是:vue-router支持WebPack內(nèi)置的異步模塊加載系統(tǒng)。所以,那些使用較少的路由組件不必打包進bundles里,只需要在路由被訪問時按需加載。

使用

假設(shè)你的路由配置是這樣的:

import MainPage from './routes/MainPage.vue'
import OtherMassivePage from './routes/OtherMassivePage.vue'

const routes = [
  { path: '/main', component: MainPage },
  { path: '/other', component: OtherMassivePage }
]

簡單來說,你可以使用require.ensure來替代import。它能幫你將OtherMassivePage組件以及該組件的所有依賴分割到一個單獨的chunk中去。

現(xiàn)在重啟你的應(yīng)用,你會發(fā)現(xiàn)并沒有什么改變。但,當(dāng)你打開開發(fā)人員工具,選擇檢查網(wǎng)絡(luò),再一次訪問/other路徑時,你會看到一個新的文件被加載進來。

import MainPage from './routes/MainPage.vue'
const OtherMassivePage = r => require.ensure([], () => r(require('./routes/OtherMassivePage.vue')))

const routes = [
  { path: '/main', component: MainPage },
  { path: '/other', component: OtherMassivePage }
]

是的,這看起來是有點奇怪,相信我,它并不是那么糟糕。

還有一種方法是將路由對應(yīng)的組件定義成異步組件。寫起來像這樣:

const OtherMassivePage = resolve => {
  // 空數(shù)組用來指定該路由組件需要加載的依賴
  require.ensure([], () => {
    resolve(require('./routes/OtherMassivePage.vue'))
  })
}

不過,你最好不要使用這種包裹起來的寫法,因為WebPack會使用靜態(tài)分析來檢測和分割塊。比較好的做法是,將他們寫成一行以減少空間的占用。

按組分塊

有時候我們想把某個路由下的所有組件都打包在同個異步 chunk 中。只需要 給 chunk 命名,提供require.ensure第三個參數(shù)作為 chunk 的名稱:

// 這兩條路由被打包在相同的塊中,訪問任一路由都會延遲加載該路由組件
const OtherMassivePage = r => require.ensure([], () => r(require('./routes/OtherMassivePage.vue')), 'big-pages')
const WeightLossPage = r => require.ensure([], () => r(require('./routes/WeightLossPage.vue')), 'big-pages')

不像許多其他的WebPack任務(wù),這個方法出乎意料的簡單,并且能產(chǎn)生意想不到的有用結(jié)果。如果你正在維護那些變得臃腫不堪的大型單頁應(yīng)用,我會毫不猶豫的將這種方法推薦給你。

End

作者:Joshua Bemenderfer
原文地址: lazy-loading-routes

譯者:jeneser
譯者GitHub:https://github.com/jeneser

版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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