【Vue】路由懒加载
2021/09/09 10:19:34
如果在项目中直接
import
引入所有组件, 打包后的代码文件会很大, 影响页面加载(首屏加载时间过长), 懒加载(按需加载)就是在加载时把组件分割为不同的代码块,第一次用到的时候加载并缓存(webpack 打包后访问新组件时发送 http 请求)
实现方法
路由懒加载
// Foo.vue 文件
// 将异步组件定义为返回一个 Promise 的工厂函数 (该函数返回的 Promise 应该 resolve 组件本身)
const Foo = () =>
Promise.resolve({
/* 组件定义对象 */
});
// router.js 路由配置文件
const router = new VueRouter({
routes: [
{ path: "/foo", component: () => import("./Foo.vue") }, // 方法一: 路由懒加载, 使用webpack2的代码分块点写法
{ path: "/foos", component: (resolve) => require(["/foo"], resolve) }, // 方法二: 异步组件,使用require引入, require 一参为要引入的组件, 参数为数组, 二参为回调函数
],
});
组件懒加载
// 同路由懒加载, 在需要的时候才加载并缓存
export default {
components: {
foo: () => import("./foo"),
foos: (resolve) => require(["./foo"], resolve),
},
data() {},
};
webpack 把组件按组分块
有时候我们想把某个路由下的所有组件都打包在同个异步块 (
chunk
) 中。只需要使用 命名chunk
,一个特殊的注释语法来提供chunk name
(需要 Webpack > 2.4)。
Webpack
会将任何一个异步模块与相同的块名称组合到相同的异步块中。
const Foo = () => import(/* webpackChunkName: "group-foo" */ "./Foo.vue");
const Bar = () => import(/* webpackChunkName: "group-foo" */ "./Bar.vue");
const Baz = () => import(/* webpackChunkName: "group-foo" */ "./Baz.vue");
加载异步组件时的 resolve 函数
const router = new VueRouter({
routes: [
{
path: "/foo",
component: (resolve) => require(["/foo"], resolve),
},
],
});
这里的
resolve
(注意resolve
只是形参) 是vue-router
返回的方法, 只执行一次, 用于(挂载组件?), 接收require
引入的模块为参数require
的一参为要引入的模块, 为多个时用数组形式传入, 二参为引入完成后的回调函数, 该回调函数的参数为一参引入的模块, 多个模块时为多个参数而不是数组
改写为以下形式也可执行
const router = new VueRouter({
routes: [
{
path: "/foo",
component: (mount) =>
require(["/foo"], (mod) => {
mount(mod);
}),
},
],
});