路由懒加载
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。
首先,可以将异步组件定义为返回一个 Promise 的工厂函数 (该函数返回的 Promise 应该 resolve 组件本身):
1
| const Foo = () => Promise.resolve({ })
|
第二,在 Webpack 2 中,我们可以使用动态 import语法来定义代码分块点 (split point):
注意:
如果您使用的是 Babel,你将需要添加 syntax-dynamic-import
插件,才能使 Babel 可以正确地解析语法。
结合这两者,这就是如何定义一个能够被 Webpack 自动代码分割的异步组件。
1
| const Foo = () => import('./Foo.vue')
|
在路由配置中什么都不需要改变,只需要像往常一样使用 Foo
:
1 2 3 4 5
| const router = new VueRouter({ routes: [ { path: '/foo', component: Foo } ] })
|
把组件按组分块
有时候我们想把某个路由下的所有组件都打包在同个异步块 (chunk) 中。只需要使用 命名 chunk,一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)。
1 2 3
| const Foo = () => import( './Foo.vue') const Bar = () => import( './Bar.vue') const Baz = () => import( './Baz.vue')
|
Webpack 会将任何一个异步模块与相同的块名称组合到相同的异步块中。
编码实战
min.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import Vue from 'vue' import App from './App.vue'
import VueRouter from 'vue-router' Vue.use(VueRouter); Vue.config.productionTip = false;
import store from './store/index'
import HelloWorld from './components/HelloWorld.vue' import Ajax from './components/Ajax.vue' import count from './components/count.vue' import father from './components/fatherAndChild/father.vue' import shop from './components/vuexDemo/shop.vue' import parent from './components/slotDemo/parent.vue' import lazyLoadDemo from './components/lazyLoad/lazyLoadDemo'
const home = () => import('./components/lazyLoad/home'); const about = () => import('./components/lazyLoad/about');
const routes = [ { path: '/', redirect: '/HelloWorld' }, { path: '/HelloWorld', component: HelloWorld }, { path: '/Ajax', component: Ajax }, { path: '/father', component: father }, { path: '/count', component: count }, { path: '/shop', component: shop }, { path: '/parent', component: parent }, { path: '/lazyLoadDemo', component: lazyLoadDemo, children: [ { path: 'home', component: home }, { path: 'about', component: about } ] },
];
const router = new VueRouter({ routes });
new Vue({ store, router, render: h => h(App), }).$mount('#app');
|
lazyLoadDemo.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <template> <div> <router-link to="/lazyLoadDemo/home"><p class="button__text">主页</p></router-link> <router-link to="/lazyLoadDemo/about"><p class="button__text">关于我们</p></router-link> <router-view></router-view> </div> </template>
<script> export default { name: "lazyLoadDemo" } </script>
<style scoped>
</style>
|