micro-app
micro-app copied to clipboard
怎么扩展 子应用被代理的 window 对象?
背景
现在有很多系统的业务背景需要 扩展 window 对象,改写一些内部的数据访问方法 和 全局变量 在文档和查看源码的时候没有发现可以扩展和更改的入口的 可能是我漏了某些地方 现在是通过发送setGlobalData 和直接访问 顶层 window 去间接的解决这些问题
期望的效果
提供扩展 window 对象的入口
目前可以通过window.__MICRO_APP_PROXY_WINDOW__操作当前子应用的window对象,后续会出一些API控制子应用的沙箱
这是我们目前规划的API,欢迎提意见
const sandBox = microApp.getSandBox(appName) // 获取子应用沙箱
sandBox.exec('code') // 在子应用中执行js代码
sandBox.getWindow() // 返回子应用的window
sandBox.getDocument() // 返回子应用的document
sandBox.inject(data: Object) // 注入子应用全局变量
sandBox.deleteInjectData(key) // 删除指定注入子应用的全局变量
sandBox.clearInjectData() // 删除所有注入子应用全局变量
这是我们目前规划的API,欢迎提意见
const sandBox = microApp.getSandBox(appName) // 获取子应用沙箱 sandBox.exec('code') // 在子应用中执行js代码 sandBox.getWindow() // 返回子应用的window sandBox.getDocument() // 返回子应用的document sandBox.inject(data: Object) // 注入子应用全局变量 sandBox.deleteInjectData(key) // 删除指定注入子应用的全局变量 sandBox.clearInjectData() // 删除所有注入子应用全局变量
这么使用的话 只能在子应用装载之后使用吧?那么在子应用装载之前就注入呢? 是否可以在 plugins global 或者 modules 配置一个 proxyWindow typeof (defaultProxyWindow) => newProxyWindow
这样既可以全局配置一个代理对象 也可以针对不同的子应用配置 同时也可以编写 micro-app 的插件扩展程序 我理解的插件系统既然存在的话那么它肯定是有更多的作用。 不清楚上面这个方式是否符合咱们的规划。
microApp.getSandBox(appName).then((sandBox) => {
sandBox.exec('code') // 在子应用中执行js代码
sandBox.getWindow() // 返回子应用的window
sandBox.getDocument() // 返回子应用的document
sandBox.inject(data: Object) // 注入子应用全局变量
sandBox.deleteInjectData(key) // 删除指定注入子应用的全局变量
sandBox.clearInjectData() // 删除所有注入子应用全局变量
})
沙箱的初始化在micro-app元素创建之后、代码执行之前。
这么看没啥子问题,但是还有个点是 所有子应用都需要执行 以上操作呢? 每个子应用都单独的执行以上代码嘛 是在 created 中执行? 我这么理解没问题吧。
这么看没啥子问题,但是还有个点是 所有子应用都需要执行 以上操作呢? 每个子应用都单独的执行以上代码嘛 是在 created 中执行? 我这么理解没问题吧。
针对所有子应用的设置只能放在插件中执行或者单独的API
是否可以为 micro-app 元素增加属性,用以扩展沙箱。我个人认为这种方式更好理解和优雅。 这里也需要考虑,这个扩展操作需不需要具有响应式,也就是当属性值变化时,要不要更新沙箱。
是否可以为 micro-app 元素增加属性,用以扩展沙箱。我个人认为这种方式更好理解和优雅。 这里也需要考虑,这个扩展操作需不需要具有响应式,也就是当属性值变化时,要不要更新沙箱。
micro-app元素属性是一次性、被动接受配置,不能有效的交互,对于沙箱这种复杂场景不太适应,除非将沙箱的功能拆封成一个个单独的配置,如执行代码、全局变量,不够灵活
主应用可以设置一个沙箱逃逸属性,然后通过对该属性添加proxy实现扩展子应用window对象;