关于ProxySandBox沙箱的问题
来源:6-4 运行环境隔离 - 代理沙箱

duiduidui
2022-01-10
在路由发生变化时,会执行isSubAppChange方法,通过window.__CURRENT_SUB_APP__和location.pathname判断子应用是否切换
export function isSubAppChange() {
window.__PREV_SUB_APP__ = window.__CURRENT_SUB_APP__
console.log('__current_sub_app ', window.__CURRENT_SUB_APP__);
console.log('location pathname ', window.location.pathname);
if(window.__CURRENT_SUB_APP__ === window.location.pathname) {
console.log('相同的子应用');
return false
}
window.__CURRENT_SUB_APP__ = window.location.pathname
console.log('不同的子应用');
return true
}
假设返回值为true,那么这里会对window写入一个新的CURRENT_SUB_APP的属性值
在这之后通过runLifeCycle函数执行prevApp.inactivate方法,在创建下一个子应用的沙箱之前,理论上无法读取CURRENT_SUB_APP属性的值(按照我的理解应该是undefined才对),但通过log却打印出了正确的值
说明ProxySandBox并没有拦截到对CURRENT_SUB_APP属性的读写,请问这是怎么回事呢?
export async function runLifeCycle() {
// 获取到上一个子应用,并将其卸载
let prevApp = filterApp('activeRule', window.__PREV_SUB_APP__)
// 获取到要跳转到的子应用,并执行对应的生命周期
let nextApp = filterApp('activeRule', window.__CURRENT_SUB_APP__)
if(!nextApp || !prevApp) {
return
}
prevApp.proxy && prevApp.proxy.inactivate()
// 依然能打印出正确的值
console.log('inactivate之后再读取CURRENT_SUB_APP', window.__CURRENT_SUB_APP__);
await destoryed(prevApp)
await beforeLoad(nextApp)
await mounted(nextApp)
}
写回答
2回答
-
明确的说。这俩操作的不是一个对象,框架操作的是原生的window对象。而子应用里的对象是被框架代理过,所以框架中如何取值都是可行的。毕竟window只有一个。
012022-01-11 -
duiduidui
提问者
2022-01-10
我大概也许明白了,对window属性读写的拦截,只会在读取或写入 app.proxy.proxy 的时候发生。
而我们在路由变化的时候,写入 window.CURRENT_SUB_APP的属性值,这个操作是直接发生在window对象身上的,为的就是在存储路由信息,在路由变化的时候进行判断00
相似问题