logo头像

人生若只如初见

vue项目首屏优化之路由懒加载

当打包构建应用时,Javascript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。

实现

  • 首先,可以将异步组件定义为返回一个 Promise 的工厂函数
  • 然后使用动态 import语法来定义代码分块点。
  • 结合这两者,定义一个能够被 Webpack 自动代码分割的异步组件。
1
2
3
4
5
6
// 原始
improt Foo from './Foo'
// 第一种方法,需要配合babel的syntax-dynamic-import插件使用
const Foo = () => import('./Foo.vue')
// 第二种方法
const Foo = resolve => require(['./Foo.vue'], resolve)

在路由配置中什么都不需要改变,只需要像往常一样使用 Foo:

1
2
3
4
5
const router = new VueRouter({
routes: [
{ path: '/Foo', component: Foo }
]
})

结合上面,路由配置如下

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
// router 文件夹下的index.js文件
import Vue from 'vue'
improt Router from 'vue-router'
improt Foo from '@/pages/Foo' // 某页面

Vue.use(Router)

// 非懒加载
/* const routes = [
{
path: '/',
name: 'Foo',
component: Foo
}
] */
// 懒加载
const routes= [
{
path: '/',
name: 'Foo',
componet: () => improt('@/pages/Foo') //其实就相当于按需加载
}
]

const router = new Router({
routes
})

export default router

这就是将不同路由对应的组件分割成不同的代码块,然后当路由被访问时才加载对应组件。

main.js入口文件关于路由的配置

1
2
3
4
5
6
7
improt router from './router' //引入路由配置文件

new Vue({
el: '#app',
router, // 注入到根实例中
render: h => h(App)
})