vue异步组件实现组件懒加载和路由懒加载
vue 异步组件
在开发过程中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。
vue 以一个工厂函数,动态导入组件,异步解析组件定义的过程我们称之为异步组件。
只有在这个组件需要被渲染的时候才会触发该工厂函数,因此我们可以通过异步组件实现组件的懒加载。
vue 异步组件动态导入的方式
1. require 动态导入
这个工厂函数会收到一个 resolve
回调,这个回调函数会在从服务器得到组件定义的时候被调用。也可以调用 reject(reason)
来表示加载失败。
Vue.component(
'async-webpack-example',
// 这个特殊的 `require` 语法将会告诉 webpack
// 自动将你的构建代码切割成多个包,这些包
// 会通过 Ajax 请求加载
resolve => require(['./my-async-component'], resolve)
)
2. import 动态导入
可以在工厂函数中返回一个 Promise
,我们可以这样使用动态导入:
Vue.component(
'async-webpack-example',
// 这个动态导入会返回一个 `Promise` 对象。
() => import('./my-async-component')
)
当使用局部注册的时候,也可以直接提供一个返回 Promise
的函数:
new Vue({
// ...
components: {
'my-component': () => import('./my-async-component')
}
})
vue组件懒加载和路由懒加载
背景
当打包构建应用时,JavaScript 包会变得非常大,造成进入页面时,需要加载过多的内容,影响首屏加载速度。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,提升首屏加载速度。
定义
懒加载也叫延迟加载或按需加载,即在需要的时候的时候进行加载。
组件懒加载,即在需要的时候,加载该异步组件。
路由懒加载,即在路由激活时,加载该路由配置下相应的异步组件。
因此我们可以通过vue异步组件实现组件懒加载和路由懒加载。
具体实现
1. require 实现懒加载
// 将原始加载方式
// import UserDetails from './views/UserDetails'
// 替换成
const UserDetails = resolve => require(['./views/UserDetails'], resolve);
2. import 实现懒加载
完整示例代码如下
import Vue from 'vue';
import Router from 'vue-router';
// 将原始加载方式
// import UserDetails from './views/UserDetails'
// 替换成
const UserDetails = () => import('./views/UserDetails');
Vue.use(Router);
export default new Router({
// ...
routes: [
{
path: '/users/:id',
component: UserDetails
}
]
});
使用webpack
有时候我们想把某个路由下的所有组件都打包在同一个异步块 (chunk) 中。可以使用 webpackChunkName
注释语法来提供命名 chunk,webpack 会将相同 chunk name 的组件组合到同一个异步块中。
const UserDetails = () =>
import(/* webpackChunkName: "group-user" */ './UserDetails.vue')
const UserDashboard = () =>
import(/* webpackChunkName: "group-user" */ './UserDashboard.vue')
const UserProfileEdit = () =>
import(/* webpackChunkName: "group-user" */ './UserProfileEdit.vue')
关于import和require的区别
require 是 CommonJs
的语法,是动态加载,在运行时加载模块里的所有方法。require 导出是值的拷贝,引入的是的是整个模块里面的对象。
import 是 ES6
的语法标准,是静态加载,编译的时候调用,不管在哪里引用都会提升到代码顶部。import 导出的是值的引用,可以按需引入模块里面的对象。
总结
组件懒加载,即在需要的时候,加载该异步组件。路由懒加载,即在路由激活时,加载该路由配置下相应的异步组件。
CommonJs
规范的 require
可以实现组件和路由的懒加载,ES6
语法标准的 import
也可以实现。
组件和路由的懒加载,一般用于首屏优化,不立刻请求资源,待首屏加载完毕或者按需响应时再加载资源。可以减少首屏加载用时,减少用户等待时长,提升用户体验。