微前端异步错误处理核心是防止子应用错误逃逸:通过沙箱隔离unhandledrejection事件、统一包装生命周期promise、用abortcontroller和封装定时器切断异步任务与生命周期绑定。

明确异步错误的逃逸路径
异步错误(如 Promise rejection、未捕获的 throw 在 setTimeout 回调里)默认不会立即中断主线程,但若未被显式处理,会以两种方式“泄露”:
- 未监听的 Promise rejection 触发全局
unhandledrejection事件,该事件在window上触发——而window是所有子应用共享的; - 子应用内
fetch、setTimeout等产生的错误,若使用了全局try/catch或错误边界外的catch,可能误捕其他子应用抛出的异常; - 子应用卸载后,其遗留的未完成 Promise 或定时器仍可能在后续 resolve/reject,回调执行时访问已销毁的状态或 DOM 节点,引发静默失败或报错。
用沙箱拦截全局错误事件
命名空间模式无法拦截异步错误,但快照沙箱或代理沙箱可重写/代理 window.addEventListener,从而隔离 unhandledrejection 和 error 的监听行为:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 子应用挂载时,沙箱劫持
addEventListener,将unhandledrejection监听器注册到子应用私有上下文(如appA.errorHandler),而非直接绑定到window; - 子应用卸载时,自动清理自己注册的所有全局监听器,避免残留;
- 主应用保留一个兜底监听器,仅用于日志上报(不
preventDefault),并标记来源子应用名,便于归因。
封装子应用异步入口,强制错误兜底
不依赖开发者手动写 try/catch 或 .catch(),而是通过生命周期钩子统一包裹:
- 主应用在调用子应用
mount()前,为其bootstrap、mount、unmount方法注入统一的异步包装器; - 该包装器对所有返回 Promise 的方法自动附加
.catch(e => app.reportError(e)),并将错误对象打上子应用标识(如{ appId: 'appB', timestamp: Date.now(), cause: e }); - 子应用内部发起的
fetch、axios请求,建议通过子应用专属的 request 实例发出,并预设onError回调,避免直接暴露原生 Promise。
切断异步任务与子应用生命周期的绑定
防止子应用卸载后异步回调仍在执行:
- 子应用需使用
AbortController管理所有 fetch 请求,并在unmount时调用controller.abort(); - 对
setTimeout、setInterval封装为带清理能力的工具函数(如app.setTimeout(fn, ms)),内部维护 ID 列表,unmount时批量清除; - 禁止子应用直接使用
Promise.resolve().then(...)这类无引用追踪的微任务——改用沙箱提供的app.nextTick(fn),确保卸载时可取消。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










