qiankun的js沙箱源码解析
qiankun的沙箱种类
- SnapshotSandbox (快照沙箱)
- LegacySandbox(支持单应用的代理沙箱)
- ProxySandbox(支持多应用的代理沙箱)
LegacySandbox 和 ProxySandbox 利用了 ES6 的 Proxy
2.x 使用 ProxySandbox
1.x 使用 LegacySandbox
不支持 Proxy 的,使用 SanpshotSandbox
快照沙箱
|
|
- 沙箱激活时
- 记录 window 当时的状态(相当于快照)
- 恢复上一次沙箱失活时记录的沙箱运行过程中对 window 做的状态改变,也就是上一次沙箱激活后对 window 做了哪些改变,现在也保持一样的改变。
- 沙箱失活时
- 记录自沙箱运行时 window 的变化
- 清除沙箱在激活之后在 window 上改变的状态,从代码可以看出,就是让 window 此时的属性状态和刚激活时候的 window 的属性状态进行对比,不同的属性状态就以快照为准,恢复到未改变之前的状态。
- 缺点
- 遍历 window,性能差
- 多子应用时,均改写沙箱状态,造成混乱
支持单应用的代理沙箱
基础逻辑
|
|
- 特点
- 使用代理 window
- 使用三个变量记录 window 的操作(window 中原来不存在的,window 中原来存在的但被更新的,所有更新的)
- 沙箱激活时
- 恢复上一次沙箱失活时记录的沙箱运行过程中对 window 做的状态改变,也就是上一次沙箱激活后对 window 做了哪些改变,现在也保持一样的改变。
- 沙箱失活时
- window 中原来不存在的变量删除
- window 中原来存在的变量但被更新的,恢复
- 优点:相对快照沙箱有性能优势
- 缺点:微应用中 fakeWindow 是一个空对象,并不实际保存变量,而创建的变量最终实际都挂载在 window 上,不适用多个应用时
如何把子应用中的 window 变成代理 window?
- loadApp 时使用沙箱的代理沙箱代替 window(详见搜索源码的 createSandboxContainer)
支持朵应用的代理沙箱
|
|
- 特点
- 每个应用都使用自己的代理 window
- 激活,失活时
- 更改对应沙箱的运行状态
- 优点:支持多实例