动态导入(import())配合路由可实现页面按需加载,提升首屏速度;需用字符串字面量或模板字符串作参数,react router 用 lazy + suspense,vue router 直接返回 import() 函数。

JavaScript 中动态导入(import())配合路由系统,能轻松实现页面的按需加载,避免首屏加载过大、提升应用启动速度。
动态导入的基本写法
使用 import() 函数返回一个 Promise,它会在运行时异步加载模块:
const module = await import('./PageHome.js');
// 或
import('./PageAbout.js').then(module => {
const component = module.default;
});
注意:import() 的参数必须是字符串字面量或模板字符串(且不能含变量拼接),否则 Webpack/Vite 等构建工具无法静态分析并生成对应 chunk。
在 React Router 中实现懒加载
以 React Router v6.4+ 为例,结合 React.lazy 和 Suspense:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 用
React.lazy包裹动态import()调用 - 将懒加载组件放在
<suspense fallback="..."></suspense>内,处理加载状态 - 确保路由配置中使用该组件(如
<route element="<Home"></route> path="/" />)
示例:
import { lazy, Suspense } from 'react';
import { Routes, Route } from 'react-router-dom';
<p>const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));</p><p>function App() {
return (
<suspense fallback="<p">Loading...</suspense></p>>
<routes><route path="/" element="<Home"></route> />
<route path="/about" element="<About"></route> />
</routes>
);
}
在 Vue Router 中配置异步组件
Vue Router 原生支持函数式组件定义,直接返回 import() 即可:
- 路由配置中的
component字段可设为返回 Promise 的函数 - Vite 或 Vue CLI 会自动将其拆分为独立 chunk
- 推荐加个简单 loading 提示(如全局
router.beforeEach配合骨架屏)
示例:
const routes = [
{
path: '/',
component: () => import('./views/Home.vue')
},
{
path: '/user',
component: () => import('./views/User.vue')
}
];
注意事项与优化建议
动态导入虽方便,但要注意几个关键点:
-
错误处理:加载失败时需捕获异常,例如用
React.Suspense的fallback+ 自定义错误边界,或 Vue 的defineAsyncComponent({ error, delay }) -
预加载提示:可在用户 hover 导航链接时提前触发
import()(需手动控制,不推荐盲目预加载) -
Webpack Chunk 名称:可通过注释指定 chunk 名,便于调试和缓存管理:
import(/* webpackChunkName: "home-page" */ './pages/Home') -
服务端渲染(SSR)兼容性:若用 Next.js/Nuxt,应优先使用框架内置的动态导入方案(如
dynamic(...)),避免直出问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










