路由懒加载的核心是按需加载,即用户访问页面时才加载对应模块代码,通过动态import()实现代码分割,配合webpackChunkName命名chunk、Suspense处理loading状态,并支持嵌套路由和权限路由的独立懒加载。
路由懒加载的核心是“按需加载”,即只在用户访问某个页面时,才去加载对应模块的代码,而不是在项目启动时就全部加载。这对降低首屏加载时间、减少初始包体积特别有效。
Vue 或 React 项目中,路由配置里别再写 import XXX from './xxx.vue' 这种同步导入。改用动态 import(),它会触发 Webpack / Vite 的代码分割机制,把组件单独打包成一个 chunk 文件。
{ path: '/user', name: 'User', component: () => import('@/views/User.vue') // ✅ 懒加载 // component: User // ❌ 同步导入,会打进主包}
const User = React.lazy(() => import('./pages/User'))
<Route path="/user" element={<Suspense fallback="加载中..."><User /></Suspense>} />
默认情况下,Webpack 生成的 chunk 名是数字(如 123.js),不利于调试和缓存管理。加个 webpackChunkName 注释,让构建工具生成可读文件名:
component: () => import(/* webpackChunkName: "user-module" */ '@/views/User.vue')
构建后会生成类似 user-module.abc123.js 的文件,方便定位和长期缓存。
懒加载有网络延迟,不能让用户干等白屏。Vue 中用 <Suspense>,React 中用 React.lazy + <Suspense> 包裹异步组件,并提供 loading 占位内容:
<template>
<Suspense>
<template #default>
<router-view />
</template>
<template #fallback>
<div class="loading">正在加载...</div>
</template>
</Suspense>
</template>
子路由也要独立懒加载,避免父组件一加载就把所有子模块拉下来:
{ path: '/admin', component: () => import('@/layouts/AdminLayout.vue'), children: [ { path: 'dashboard', component: () => import('@/views/admin/Dashboard.vue') // ✅ 子路由也懒加载 }, { path: 'users', component: () => import('@/views/admin/Users.vue') } ]}
权限路由(如登录后才可进的页面)更推荐懒加载——既减体积,又避免未登录时提前加载敏感逻辑或接口调用。