微前端全局作用域隔离核心是切断子应用对真实window的直接读写,qiankun通过Proxy沙箱(动态拦截读写)、快照沙箱(静态快照还原)、globals配置(只读注入)和插件机制(生命周期接管)实现多维度隔离。

微前端中,全局作用域隔离的核心是切断子应用对真实 window 的直接读写,让每个子应用运行在“看似有全局环境、实则互不干扰”的独立上下文中。qiankun 默认通过沙箱(Sandbox)实现这一点,关键不在消灭全局作用域,而在于重定向和拦截。
Proxy 沙箱:默认且主流的动态隔离方式
它为每个子应用创建一个 fakeWindow 代理对象,所有 JS 执行时的 this 和全局引用(如 console、fetch、localStorage)都指向这个代理,而非真实 window:
-
读取(get):先查
fakeWindow本地是否有该属性;没有则委托给真实window(只读访问主应用能力) -
写入(set):只写入
fakeWindow,真实window完全不受影响 - 子应用挂载时激活代理,卸载时释放引用,多个子应用可并行运行,彼此的
window.xxx = 1互不可见
快照沙箱:兼容性兜底的静态隔离方式
当浏览器不支持 Proxy 或配置 singleton: false 时启用。它不拦截操作,而是靠“时间切片”管理状态:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 子应用激活前,遍历并保存当前
window所有属性快照 - 子应用运行期间自由修改
window(如挂载window.MyLib) - 子应用卸载时,还原快照值,并清理新增属性
- 仅适用于单实例场景——若两个子应用同时运行,后激活的会覆盖前者的快照,导致状态错乱
globals 配置:安全注入只读全局变量
这是沙箱之上的轻量扩展,用于向子应用提供主应用侧可控的上下文,不破坏隔离原则:
- 普通值(如
tenantId: 'acme')会作为只读全局变量注入子应用的执行环境 - 带描述符的对象(如含
value、configurable)会被按Object.defineProperty方式定义,可设为不可写、不可枚举 - 避免误判:若业务对象本身含
writable等字段,必须用{ value: obj }显式包裹
插件机制(plugins):接管更复杂的隔离需求
当需要在沙箱生命周期中注入副作用(如监听、定时器、DOM 事件绑定)或重建状态时,使用插件:
- 插件需实现
init、patch(激活)、restore(失活)方法 - 例如:拦截并重定向子应用对
document.cookie的访问,或为每个子应用维护独立的localStorage分区 - 比
globals更重,但能应对多次挂载/卸载、状态持久化等复杂场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










