icestark
icestark copied to clipboard
sandbox无法屏蔽子应用修改原型
现状: 我建的微前端关联了几个子应用,并且都开启了sandbox,其中一个子应用的依赖插件修改了全局Date原型,通过debug发现,sandbox无法屏蔽原型改动,影响了全局,并且在其他子应用中由于这个改动导致报错。 期望: 能够提供sandbox更全面的控制,屏蔽原型的修改,或者提供sandbox选项,对于原型的改动屏蔽可以进行开关。
使用的ice框架版本号 @ice/stark": "^1.4.0"
sandbox 原理是对 window 上的属性进行劫持,即通过 proxy 代理,如下修改:
window.a = 1;
对于 a 属性的修改可以被劫持,如果修改的属性如下:
// 原先存在 window.a = {},开启 sandbox 后修改 a 上面的属性
window.a.b = 1;
没有对 window 上的属性修改,不会被代理劫持
sandbox 原理是对 window 上的属性进行劫持,即通过 proxy 代理,如下修改:
window.a = 1;对于 a 属性的修改可以被劫持,如果修改的属性如下:
// 原先存在 window.a = {},开启 sandbox 后修改 a 上面的属性 window.a.b = 1;没有对 window 上的属性修改,不会被代理劫持
1、普通属性问题不大,重复的可能性也不高,但是修改原型这是很多插件或者公共方法会做的,这个影响是会非常大的,如果是有复用性的修改,我会提升到容器应用中处理,其他情况,我觉得都可以劫持掉。 2、现在sandbox的原理我看了,确实没有嵌套的劫持,但是我希望能够有,因为用户开启sandbox的时候的心智是希望能够屏蔽子应用所有修改带来的副作用。希望能够解决这个问题。
sandbox 原理是对 window 上的属性进行劫持,即通过 proxy 代理,如下修改:
window.a = 1;对于 a 属性的修改可以被劫持,如果修改的属性如下:
// 原先存在 window.a = {},开启 sandbox 后修改 a 上面的属性 window.a.b = 1;没有对 window 上的属性修改,不会被代理劫持
1、普通属性问题不大,重复的可能性也不高,但是修改原型这是很多插件或者公共方法会做的,这个影响是会非常大的,如果是有复用性的修改,我会提升到容器应用中处理,其他情况,我觉得都可以劫持掉。 2、现在sandbox的原理我看了,确实没有嵌套的劫持,但是我希望能够有,因为用户开启sandbox的时候的心智是希望能够屏蔽子应用所有修改带来的副作用。希望能够解决这个问题。
现在sandbox是用with + new Function + proxy实现的,针对IE我没试 也不知道支不支持 qiankun应该是这种方式 + 快照实现的 要想解决你的这个逃逸问题 可能得用with + new Function + Proxy + iframe proxy代理的window对象搞成iframe.contentWindow 这样应该不会有问题了
考虑到 proxy 性能的影响,不会考虑对二级属性进行劫持。可以自行定义劫持函数,比如:
const testObject = { a: 1 };
const testProxy = new Proxy(testObject, {
get(target, p, receiver) {
if(p === 'a') {
return 2;
}
return Reflect.get(target, p);
}
})
const sandbox = new Sandbox({multiMode: false, injection: {testObject: testProxy}});
对于用户,可使用如下方式传递这个自定义 proxy。
<AppRouter
sandbox={{ injection: { testObject: testProxy } }}
>
</AppRouter>