import() 是返回 Promise 的动态导入函数,支持运行时条件加载、变量路径和异步处理,经历获取、实例化、执行三阶段后以命名空间对象兑现 Promise。

JavaScript 的 import() 是一个返回 Promise 的函数,用于动态、按需加载模块,它的异步本质决定了它必须等待模块解析、下载(如需)、执行完成后才兑现 Promise。
运行时触发,不参与静态分析
与静态 import 语句不同,import() 是一个表达式,可在任意位置调用(条件判断、循环、事件回调中),浏览器或 Node.js 不会在代码初始化阶段预处理它。模块路径可以是变量或拼接字符串,只要最终是有效模块说明符即可。
- 路径支持相对路径、绝对路径、完整 URL(需符合 CORS)和包名(如
"lodash",依赖运行时解析器) - 不能使用模板字面量中的非常量表达式(如
import(`./mod-${flag}.js`)在 flag 为变量时可能被某些打包工具限制) - ESLint 等工具无法在构建期校验其路径有效性,错误通常在运行时抛出
加载过程分三阶段:获取 → 实例化 → 执行
根据 HTML 规范和 ES 模块加载协议,一次 import() 调用会依次经历:
- 获取(Fetch):发起网络请求(若模块未缓存),支持 HTTP 缓存策略;本地文件则直接读取
-
实例化(Instantiate):解析模块语法,建立模块记录,解析并链接所有静态
import依赖(递归进行) - 执行(Evaluate):按拓扑顺序运行模块顶层代码,包括导出绑定和副作用逻辑
这三个阶段全部完成,Promise 才会以模块命名空间对象({ default: ..., foo: ... })形式 fulfilled。
立即学习“Java免费学习笔记(深入)”;
可配合 async/await 或 .then() 使用,支持错误捕获
由于返回 Promise,必须用异步方式处理结果。推荐使用 try/catch 捕获加载失败(如 404、语法错误、循环依赖中断等):
async function loadChart() {
try {
const { default: Chart } = await import('./chart.js');
new Chart('#chart');
} catch (err) {
console.error('图表模块加载失败:', err);
fallbackToImage();
}
}也可链式调用 .catch(),但 async/await 更利于错误定位和控制流管理。
与打包工具协同优化加载行为
在 Webpack、Vite、Rollup 等环境中,import() 是代码分割(code splitting)的明确信号:
- 打包器会将目标模块及其依赖单独抽成一个 chunk 文件(如
123.chunk.js) - 支持魔法注释(如
/* webpackChunkName: "charts" */)自定义 chunk 名称,便于调试和缓存管理 - Vite 中还支持
import.meta.glob()等扩展语法批量处理动态导入场景
注意:Node.js 原生 ESM 中暂不支持魔法注释,仅在打包环境下生效。









