generator 能天然适配微前端沙箱生命周期管理,通过 yield 精确控制挂载、运行、暂停、卸载等阶段,结合 proxy 实现可恢复隔离环境,并支持多实例并行与状态快照回滚。

Generator 本身不直接构建沙箱,但它能天然适配微前端沙箱的生命周期管理逻辑——尤其是“挂载→运行→暂停→卸载→恢复”这一串异步、可中断、需状态记忆的流程。用它来组织沙箱行为,比纯回调或 Promise 链更清晰、可控,也更容易注入扩展点。
用 Generator 管理沙箱生命周期
微前端沙箱的核心动作是:激活(mount)、运行(execute)、暂停(pause)、失活(unmount)。这些不是线性执行一次就结束,而是可能反复切换、中间需保存上下文。Generator 的 yield 正好对应每个关键节点,每次 next() 就推进一个阶段,且函数内部状态自动保留。
- 定义一个 generator 函数,把沙箱各阶段封装为 yield 点:比如 yield 'beforeMount' → yield 'mount' → yield 'run' → yield 'pause' → yield 'unmount'
- 外部控制器按需调用 next(),传入参数(如子应用 entry、sandbox config)驱动流程
- 每个 yield 后可插入中间件钩子(如日志、权限校验、资源预加载),实现可插拔扩展
结合 Proxy 实现可恢复的隔离环境
Generator 负责流程调度,真正隔离靠 Proxy。但 Proxy 对象本身无状态记忆,而 Generator 可以记住上次停在哪、window 做了哪些修改。例如:
- 在 yield 'mount' 阶段,创建 Proxy 包裹的 sandboxWindow,并记录初始属性快照
- yield 'run' 时让子应用代码执行,Proxy 拦截所有对 window 的读写,只允许沙箱内可见
- yield 'pause' 时不销毁 Proxy,只冻结当前变更,保留 injectedKeys 和代理句柄
- 下次 yield 'resume' 时,直接复用原 Proxy 实例,无需重建环境
支持多实例并行与状态快照回滚
单个 Generator 实例只能串行推进,但微前端常需多个子应用共存。解决方案是:每个沙箱绑定独立 Generator 实例 + 独立 Proxy 环境。
- 用 Map 存储 { appId → generatorIterator },按需 resume 指定实例
- 在 yield 'unmount' 阶段,触发快照比对:遍历 injectedKeys,将新增属性从真实 window 删除,还原为纯净状态
- 若需热重载,可在 yield 'reconnect' 阶段重新注入已缓存的 proxy 对象,跳过完整重建
避免常见陷阱:Symbol.unscopables 与 with 逃逸
有些沙箱方案会配合 with + Proxy 使用,但 with 在严格模式下禁用,且遇到 Symbol.unscopables: true 的对象(如 Array.prototype)会绕过作用域限制,导致污染。Generator 不解决这个问题,但能帮你优雅兜底:
- 在 yield 'beforeMount' 阶段,预先扫描子应用代码 AST 或运行时拦截,标记高危 API(如 eval、document.write)
- yield 'run' 前,动态 patch 全局对象(如重写 Array.prototype.map),使其返回沙箱感知版本
- 一旦检测到逃逸行为(如访问了非代理 window 属性),立即 throw 并由 Generator 捕获,触发安全降级(如切 iframe 沙箱)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











