异步组件介绍
在开发大型项目的时候,我们会把大型项目根据组件分割为小块代码,然后异步加载代码块,这样可以让首屏部分代码块优先加载,加快首屏渲染速度,其他代码块在需要的时候再加载,加载过的代码块会被缓存起来,以便复用重新渲染。
参考Vue官方文档异步加载.
异步组件声明
异步组件声明主要通过将 Vue.component() 方法的第二个声明为工厂函数,这个工厂函数会收到一个 resolve 回调,这个回调函数会在你从服务器得到组件定义的时候被调用。你也可以调用 reject(reason) 来表示加载失败。一个推荐的做法是将异步组件和 webpack 的 code-splitting 功能一起配合使用,下面的require是webpack支持的AMD异步加载方式,require方法的第二个参数是加载成功后的回调函数,我们在组件资源加载成功后,调用resolve完成组件注册
Vue.component('async-webpack-example', function (resolve,reject) {
// 这个特殊的 `require` 语法将会告诉 webpack
// 自动将你的构建代码切割成多个包,这些包
// 会通过 Ajax 请求加载
require(['./my-async-component'], resolve)
})
你也可以在工厂函数中返回一个 Promise,所以把 webpack 2 和 ES2015 语法加在一起,我们可以这样使用动态导入:
Vue.component(
'async-webpack-example',
// 这个动态导入会返回一个 `Promise` 对象。
() => import('./my-async-component')
)
然后可能有些使用webpack的同学编译的时候会报错Unexpected token ,正好在import语法的地方,为了支持动态导入 import() 需要安装babel插件,Babel@6需要使用babel-plugin-syntax-dynamic-import,Babel@7使用@babel/plugin-syntax-dynamic-import
在.bablerc中引入syntax-dynamic-import插件
npm install --save-dev @babel/plugin-syntax-dynamic-import
{
"plugins": ["@babel/plugin-syntax-dynamic-import"]
}
上面都是全局注册,我们也可以组件内局部注册
export default{
// ...
components: {
'my-component': () => import('./my-async-component')
}
}
或者使用require方法
export default{
// ...
components: {
'lotteryResultH5': (resolve) => require(['./lottery-result-h5'], resolve),
}
}
路由懒加载介绍
通过异步组件和webpacm代码分割,实现路由懒加载,按需加载,提升路由页面加载速度。
路由懒加载方法
通过工厂函数返回一个Promise对象,异步加载组件
import() 返回一个promise对象
var myComponent = () => import('./my-component')
const routes = [
{
name: "MyCompoent",
path: 'my-compoent',
component: myComponent
}
]
通过AMD异步加载方式(require)
const routes = [
{
name: "MyCompoent",
path: 'my-compoent',
component: (resolve) => require(['./my-component'], resolve),
}
]