import() 是 javascript 动态导入语法,返回 promise,用于运行时按需加载模块;支持字符串路径、模板字面量,不可用纯变量;需 await/.then 处理,常用于懒加载、条件加载及多环境适配。

import() 是 JavaScript 中的动态导入语法,返回一个 Promise,用于在运行时按需加载模块,适合实现代码分割、路由懒加载、条件加载等场景。
基本用法:调用 import() 加载模块
与静态 import 不同,import() 是函数调用,参数为模块路径(字符串),支持变量和表达式:
- 路径必须是字符串字面量或可静态分析的表达式(如模板字符串拼接固定前缀)
- 不能使用纯变量(如
import(moduleName)),否则打包工具无法分析依赖 - 返回 Promise,需用
await或.then()处理结果
示例:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
async function loadUtils() {
const utils = await import('./utils.js');
utils.doSomething();
}
配合路由或交互事件做懒加载
常见于单页应用中,点击按钮或进入某路由时才加载对应模块:
- React 中常配合
React.lazy和Suspense使用(内部即基于import()) - Vue 中
defineAsyncComponent也基于它 - 原生 JS 可直接绑定事件:
document.getElementById('load-chart').addEventListener('click', async () => {
const { renderChart } = await import('./chart-renderer.js');
renderChart();
});
加载不同环境或条件模块
根据运行时条件选择加载不同实现,比如按浏览器特性或用户权限:
- 避免打包进所有环境的代码,减小初始体积
- 注意路径必须能被构建工具识别(如 Webpack/Vite 支持
import(`./locales/${lang}.js`)这类简单模板)
async function loadLocale(lang) {
try {
const mod = await import(`./locales/${lang}.js`);
return mod.default;
} catch (err) {
// 回退到默认语言
const mod = await import('./locales/zh.js');
return mod.default;
}
}
注意事项与常见限制
import() 强大但有边界,实际使用需留意:
- 不支持在顶层作用域(模块最外层)用
await,必须包裹在async函数中 - Webpack 中若路径含变量,需确保其取值范围有限且可静态推断,否则会打包所有匹配文件
- Vite 对动态路径支持更好,但仍建议避免过于复杂的表达式
- 加载失败会 reject,务必用
try/catch或.catch()处理错误










