Vue.js - 路由的懒加载实现详解(组件的异步加载)
作者:hangge | 2026-09-01 09:19
在真实开发过程中,一个项目可能会包含大量页面组件。如果这些组件都没有使用异步加载,那么在打包构建生产项目时,JavaScript 包会变得非常大,从而影响页面的首屏加载速度,为了解决这个问题,可以将不同路由对应的组件分割成不同的代码块,然后在访问路由时才加载对应的组件。这种做法不仅更加高效,还可以提高首屏加载速度。实际上,Vue Router 默认就支持异步加载组件,也就是所谓的路由懒加载,下面我将通过样例进行演示。
(2)将项目编译打包后生成的文件如下,可以看到生成的 js 只有两个,其中:
1,未配置路由懒加载情况
(1)下面是一个 Vue.js 项目的 src/router/index.js 文件内容,可以看到 component 属性直接接收一个组件,没有配置任何路由懒加载。
import Vue from "vue";
import VueRouter from "vue-router";
import HomeView from "../views/HomeView.vue";
import AboutView from "../views/AboutView.vue";
Vue.use(VueRouter);
const routes = [
{
path: "/",
name: "home",
component: HomeView,
},
{
path: "/about",
name: "about",
component: AboutView,
},
];
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes,
});
export default router;
(2)将项目编译打包后生成的文件如下,可以看到生成的 js 只有两个,其中:
- app.4c13ceeb.js 文件存放的是我们编写的所有代码。
- chunk-vendors.7a4240ff.js 文件存放的是第三方库的代码。

2,配置路由懒加载的情况
(1)将 src/router/index.js 文件内容进行修改,这次的 component 属性会接收一个函数,该函数需要返回一个 Promise 对象,而 import 函数正好可以动态导入组件并返回一个 Promise 对象。
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
const routes = [
{
path: "/",
name: "home",
component: () => import("../views/HomeView.vue"),
},
{
path: "/about",
name: "about",
component: () => import("../views/AboutView.vue"),
},
];
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes,
});
export default router;
- 打包后文件如下,可以看到配置了路由懒加载会进行分包,但分出来的包的名称都是随机生成的。比如 201.aeb7af2f.js 存放的是 HomeView.vue 页面组件的代码,而 417.bf816cfd.js 存放的是 AboutView.vue 页面组件的代码。
(2)自 webpack3.x 起,就支持对分包进行命名(chunk name)。在 import 函数的参数中添加魔法注释,例如 /*webpackChunkName:"自定义分包名" */,即可对分包进行命名。
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
const routes = [
{
path: "/",
name: "home",
component: () =>
import(/* webpackChunkName: "home" */ "../views/HomeView.vue"),
},
{
path: "/about",
name: "about",
component: () =>
import(/* webpackChunkName: "about" */ "../views/AboutView.vue"),
},
];
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes,
});
export default router;
- 重新打包,可以看到这次打包后生成的包已有对应的名称。

全部评论(0)