死亡是一座永恒的灯塔

0%

Vue路由懒加载

路由懒加载

当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。

首先,可以将异步组件定义为返回一个 Promise 的工厂函数 (该函数返回的 Promise 应该 resolve 组件本身):

1
const Foo = () => Promise.resolve({ /* 组件定义对象 */ })

第二,在 Webpack 2 中,我们可以使用动态 import语法来定义代码分块点 (split point):

1
import('./Foo.vue') // 返回 Promise

注意:

如果您使用的是 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(/* webpackChunkName: "group-foo" */ './Foo.vue')
const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
const Baz = () => import(/* webpackChunkName: "group-foo" */ './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-router 库
Vue.use(VueRouter);
Vue.config.productionTip = false;

import store from './store/index' //导入 store 对象



//组件引入
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'
// import home from './components/lazyLoad/home'
// import about from './components/lazyLoad/about'
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>
坚持技术分享,您的支持将鼓励我继续创作!