动态 import() 是 JavaScript 原生异步模块加载机制,返回 Promise,支持运行时按需加载、延迟加载与按需渲染,适用于路由拆分、条件加载及交互触发模块,需配合错误处理与加载状态管理。

动态 import() 是 JavaScript 原生支持的异步模块加载机制,它返回一个 Promise,让你可以在运行时按需加载模块,从而实现延迟加载(lazy loading)和按需渲染(on-demand rendering)。相比静态 import,它不参与构建时依赖分析,也不会阻塞初始加载,特别适合路由级拆分、条件加载组件、或用户交互触发的功能模块。
延迟加载:在需要时才加载模块
常见于点击按钮后加载某个功能模块,避免初始包体积过大。
- 用
import()替代静态导入,传入模块路径字符串(支持变量拼接,但不能是完全动态表达式) - 配合
await或.then()获取导出对象,再执行逻辑 - 路径必须是相对或绝对 URL,不能是纯变量(如
import(moduleName)不合法),但可基于条件拼接,例如:import(`./utils/${type}.js`)
示例:
async function loadChartLib() {
const { default: Chart } = await import('chart.js');
const ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, { /* 配置 */ });
}按需渲染:结合 React/Vue 等框架动态挂载组件
在前端框架中,动态 import() 常用于实现组件级懒加载,配合 Suspense 或 defineAsyncComponent 提升首屏性能。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- React 中使用
React.lazy()包裹import(),再配合<Suspense fallback>处理加载状态 - Vue 3 中用
defineAsyncComponent(),内部也是基于import(),支持 loading/error 状态处理 - 原生 JS 也可手动控制:加载完成后插入 DOM、初始化实例、或替换占位元素
React 示例:
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
<p>function App() {
return (
<Suspense fallback="<div>Loading...</div>">
<HeavyComponent />
</Suspense>
);
}配合路由实现页面级代码分割
单页应用中,不同路由通常对应不同功能模块,用动态 import 可让每个路由只加载自身所需代码。
- 在路由配置中直接使用
import()加载组件模块(如 Vue Router 的component: () => import('./About.vue')) - Webpack/Vite 会自动将该模块拆分为独立 chunk,文件名含 hash,支持 HTTP 缓存
- 注意:不要在循环或高频事件中无节制调用
import(),避免重复请求或内存泄漏
错误处理与加载状态管理
动态 import 是异步操作,必须考虑网络失败、模块不存在等异常场景。
- 用
try/catch捕获 Promise rejection,提示用户或回退到降级方案 - 可添加加载中 UI(如 skeleton、spinner)、超时控制(封装带 timeout 的加载函数)
- 对同一模块多次
import()调用,浏览器和打包工具会自动去重(Promise 缓存),无需手动 memoize
简单错误处理示例:
async function safeImport(path) {
try {
return await import(path);
} catch (err) {
console.error('模块加载失败:', path, err);
throw new Error(`无法加载 ${path}`);
}
}

















