动态导入(import())返回 promise,天然适配 async/await;可直接 await 加载模块、用 try/catch 统一错误处理;支持按需加载、条件分支、并行加载及封装缓存/超时等复用逻辑。

动态导入(import())返回一个 Promise,天然适配 async/await,让异步模块加载变得清晰、可控、易读。
直接 await 动态导入表达式
最简洁的方式是把 import() 当作普通 Promise 使用,直接 await 它:
- 模块加载完成,自动解包导出对象(默认导出或具名导出)
- 无需手动调用
.then(),避免嵌套回调 - 错误可统一用
try/catch捕获,逻辑更集中
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function loadChart() {
try {
const { default: Chart } = await import('chart.js');
new Chart(ctx, { /* 配置 */ });
} catch (err) {
console.error('图表库加载失败', err);
}
}按需加载 + 条件分支
结合业务逻辑判断是否需要加载、加载哪个模块,代码更轻量、更精准:
- 只在用户点击“导出”时才加载
xlsx库 - 根据设备类型决定加载桌面版还是移动端 UI 组件
- 路由切换时动态加载对应页面模块(类似 React 的
lazy)
示例:
async function handleExport(format) {
if (format === 'xlsx') {
const { utils, writeFile } = await import('xlsx');
const wb = utils.book_new();
writeFile(wb, 'data.xlsx');
}
}预加载与并行加载
多个模块无依赖关系时,可用 Promise.all() 并发加载,减少总延迟:
- 同时请求 UI 组件库和工具函数模块
- 提前触发非关键模块的加载(如“稍后可能用到的设置页”)
- 注意:并发请求数过多可能影响首屏体验,建议合理拆分
示例:
async function initDashboard() {
const [ui, helpers] = await Promise.all([
import('./components/dashboard-ui.js'),
import('./utils/dashboard-helpers.js')
]);
ui.render();
helpers.init();
}封装成可复用的加载函数
把重复逻辑抽离,比如加 loading 状态、缓存、超时控制,提升可维护性:
- 统一处理加载中/失败 UI 状态
- 对同一路径的
import()做简单内存缓存(避免重复请求) - 添加 timeout 保护,防止模块卡死阻塞后续流程
示例(简易缓存版):
const moduleCache = new Map();
<p>async function loadModule(path, options = {}) {
const { timeout = 10000 } = options;</p><p>if (moduleCache.has(path)) {
return moduleCache.get(path);
}</p><p>const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), timeout);</p><p>try {
const mod = await import(path + '?t=' + Date.now());
moduleCache.set(path, mod);
return mod;
} finally {
clearTimeout(timer);
}
}</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










