关于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回答

yancy

2022-01-11

明确的说。这俩操作的不是一个对象,框架操作的是原生的window对象。而子应用里的对象是被框架代理过,所以框架中如何取值都是可行的。毕竟window只有一个。

0
1
duiduidui
明白了,谢谢老师
2022-01-11
共1条回复

duiduidui

提问者

2022-01-10

我大概也许明白了,对window属性读写的拦截,只会在读取或写入 app.proxy.proxy 的时候发生。
而我们在路由变化的时候,写入 window.CURRENT_SUB_APP的属性值,这个操作是直接发生在window对象身上的,为的就是在存储路由信息,在路由变化的时候进行判断

0
0

从0打造微前端框架,实战汽车资讯平台

专为2~5年前端工程师打造的架构能力提升课

781 学习 · 204 问题

查看课程