动态导入批量加载需并发控制,可用分批+Promise.allSettled实现;应传工厂函数而非直接调用import;需为每个模块添加超时、降级与重试;结合Map缓存和pending标记避免重复加载。

动态导入(import())本身不带并发控制,它只是按需发起单个模块加载请求。但当批量触发多个 import()(比如路由预加载、插件系统初始化、多组件懒加载)时,若不加限制,会瞬间发出大量网络请求,可能触发浏览器连接限制(通常同源 6 个)、CDN 限流或服务端拒绝,甚至拖慢主线程解析。
用 Promise.allSettled + 分批执行实现可控并发
这是最轻量、无依赖、兼容性好的方案。核心是把一批 import() 工厂函数切片,每次只并发执行固定数量,等整批完成再处理下一批。
- 必须传“工厂函数”,而非已调用的
import():写成() => import('./a.js'),避免提前触发 - 用
Promise.allSettled确保单个模块失败不影响整批,返回统一状态数组 - 递归或循环驱动批次,避免栈溢出(任务数超 500 建议用 while + await)
示例代码:
const loadModulesInBatches = async (paths, limit = 3) => {const tasks = paths.map(p => () => import(p));
const results = [];
let i = 0;
while (i const batch = tasks.slice(i, i + limit).map(t => t());
const batchResult = await Promise.allSettled(batch);
results.push(...batchResult);
i += limit;
}
return results;
};
// 使用
loadModulesInBatches(['./auth.js', './api.js', './ui.js', './utils.js'], 2)
.then(results => {
results.forEach((r, idx) => {
if (r.status === 'fulfilled') console.log(`模块 ${idx} 加载成功`);
else console.warn(`模块 ${idx} 失败:`, r.reason);
});
});
为每个 import 添加超时与降级兜底
单个模块加载卡住(如网络中断、CDN 故障)会导致整批阻塞。可在每个 import() 外层套一层超时和错误恢复逻辑:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 用
Promise.race包裹import()和一个定时 reject 的 Promise - 捕获失败后返回默认空模块对象,保证后续逻辑不崩(如
{ default: {} }) - 可配合重试机制(如失败后延迟 1s 再试一次)
示例:
const safeImport = async (path, timeout = 5000, retry = 1) => {for (let i = 0; i try {
const mod = await Promise.race([
import(path),
new Promise((_, reject) =>
setTimeout(() => reject(new Error(`timeout ${timeout}ms`)), timeout)
)
]);
return mod;
} catch (err) {
if (i === retry) throw err;
await new Promise(r => setTimeout(r, 1000));
}
}
};
// 在分批中使用:
const task = () => safeImport('./feature.js');
结合模块缓存与状态管理避免重复加载
多次调用 import('./x.js') 会复用已解析的模块(浏览器/打包器自动缓存),但若路径含变量(如 import(`./${name}.js`)),不同字符串仍视为不同请求。建议:
- 维护一个
Map缓存已加载成功的模块引用,避免重复import() - 对正在加载中的路径加 pending 标记,后续相同请求直接 await 对应 Promise
- 加载失败路径可标记为“不可用”,短期内不再尝试(如 5 分钟内)
这样既节省资源,又提升响应速度,尤其适合插件化或配置驱动的模块加载场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










