作者: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許可證)