javascript 中可使用动态导入 import() 在条件分支中按需加载模块,它返回 promise,支持 await 或 .then(),适用于运行时决定路径的场景,如 if/else、switch 或映射表方式加载,并需配合错误处理与注意路径安全、顶层限制等约束。

在 JavaScript 中,可以使用 动态导入(import()) 在条件分支中按需加载脚本,它返回一个 Promise,支持 await 或 .then() 处理。与静态 import 不同,动态导入可在运行时决定模块路径,非常适合根据环境、用户操作或配置加载不同逻辑。
在 if/else 中按条件加载不同模块
直接在分支内调用 import(),并 await 其结果(注意:需在 async 函数中):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function loadHandler(type) {
if (type === 'chart') {
const { renderChart } = await import('./charts.js');
renderChart();
} else if (type === 'map') {
const { showMap } = await import('./maps.js');
showMap();
} else {
const { fallbackUI } = await import('./ui.js');
fallbackUI();
}
}
配合 switch 或对象映射提升可维护性
避免长链 if-else,用映射表 + 动态路径更清晰:
- 定义模块路径映射:
const moduleMap = {
auth: './features/auth.js',
payment: './features/payment.js',
analytics: './features/analytics.js'
};
- 按需导入并执行:
async function loadFeature(key) {
const path = moduleMap[key];
if (!path) throw new Error(`Unknown feature: ${key}`);
const mod = await import(path);
// 假设每个模块默认导出一个初始化函数
mod.default?.();
}
错误处理与降级策略
网络失败或模块不存在会触发 Promise reject,务必捕获:
async function safeLoad() {
try {
const { init } = await import('./optional-feature.js');
init();
} catch (err) {
console.warn('Failed to load optional feature, using fallback', err);
// 加载轻量替代逻辑,或显示提示
document.getElementById('feature').textContent = '功能暂不可用';
}
}
注意事项和常见坑
-
import()只接受字符串字面量或模板字符串(如./${name}.js),但变量插值需确保路径是**确定且安全的**,不能是用户输入或未经校验的拼接; - 不能在顶层(非 async 函数)直接 await,需包裹在 async 函数或用
.then(); - Webpack/Vite 等构建工具会自动识别
import()并生成独立 chunk,但路径必须能被静态分析(例如避免import(someVar)); - 多次导入同一路径会被自动缓存,不会重复请求。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










