做者:Joshua Bemenderfervue
原文地址: lazy-loading-routeswebpack
译者:jenesergit
当你的SPA(单页应用程序)变得复杂时,打包构建后的Javascript包会变得很是大,以致于严重影响页面的加载时间。幸运的是:
vue-router
支持WebPack内置的异步模块加载系统。因此,那些使用较少的路由组件没必要打包进bundles里,只须要在路由被访问时按需加载。github
假设你的路由配置是这样的:web
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中去。vue-router
如今重启你的应用,你会发现并无什么改变。但,当你打开开发人员工具,选择检查网络,再一次访问/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 } ]
是的,这看起来是有点奇怪,相信我,它并非那么糟糕。网络
还有一种方法是将路由对应的组件定义成异步组件。写起来像这样:异步
const OtherMassivePage = resolve => { // 空数组用来指定该路由组件须要加载的依赖 require.ensure([], () => { resolve(require('./routes/OtherMassivePage.vue')) }) }
不过,你最好不要使用这种包裹起来的写法,由于WebPack会使用静态分析来检测和分割块。比较好的作法是,将他们写成一行以减小空间的占用。ide
有时候咱们想把某个路由下的全部组件都打包在同个异步 chunk 中。只须要 给 chunk 命名,提供require.ensure
第三个参数做为 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任务,这个方法出乎意料的简单,而且能产生意想不到的有用结果。若是你正在维护那些变得臃肿不堪的大型单页应用,我会坚决果断的将这种方法推荐给你。
End
原文地址: lazy-loading-routes
译者:jeneser
译者GitHub:https://github.com/jeneser
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
勘误&讨论: New issue