原因
- 由于业务原因,子应用都需要保持状态,所以给子应用都设置为保活模式,在路由跳转时,无奈只能通过eventBus传递给子应用,由子应用进行跳转。
- 但是当出现一些情况我们需要刷新子应用,比如登录状态变了,用户退出登录。重新登录进入,子应用应该重新打开,虽说可以重新传递用户信息等参数给子应用,但是要处理的逻辑就未免过多了,也为未来运行埋下坑。
- 所以,就需要一个方法,让保活的子应用失效,在切换到该子应用时,子应用能够重新加载。
- 之前尝试了一下
刷新页面(window.reload)
,可以把子应用杀死,但是不优雅,而且用户体验不好。
destroyApp
虽然杀死了应用,但是再也打不开了(没试过,官方说如果再也用不到该子应用才使用这个方法)。
- 无界作者在github的issue中提到,未来也许会提供
refreshApp
的方法,用来主动刷新保活的子应用。
- 但是现阶段还未提供这个方法,可以按照下面的方式来销毁应用。
- 这个方法我是从无界交流群里面知道的,副作用未知。
具体方法
在子应用中销毁
| |
| window.__WUJIE?.inject?.idToSandboxMap.clear(); |
在主应用中销毁
| interface HTMLIframeElementWithContentWindow extends HTMLIFrameElement { |
| contentWindow: Window; |
| } |
| |
| |
| const refreshApp = (name = "") => { |
| if (!name) { |
| console.error("refreshApp方法必须传入子应用的name属性"); |
| return; |
| } |
| |
| |
| const SUB_FRAME = window.document.querySelector( |
| `iframe[name=${name}]` |
| ) as HTMLIframeElementWithContentWindow; |
| |
| if (!SUB_FRAME) { |
| console.warn(`未找到${name}子应用,跳过刷新`); |
| return; |
| } |
| |
| const SUB_WINDOW = SUB_FRAME.contentWindow; |
| const SUB_IDMAP = SUB_WINDOW.__WUJIE?.inject?.idToSandboxMap; |
| SUB_IDMAP.clear(); |
| }; |
| |
| |
| refreshApp(); |
| interface HTMLIframeElementWithContentWindow extends HTMLIFrameElement { |
| contentWindow: Window; |
| } |
| |
| |
| const refreshAllApp = () => { |
| |
| const ALL_SUB_IFRAME = window.document.querySelectorAll( |
| "iframe[data-wujie-flag]" |
| ); |
| |
| if (ALL_SUB_IFRAME.length === 0) { |
| console.warn("未找到任何子应用,跳过刷新"); |
| return; |
| } |
| |
| |
| const ALL_SUB_WINDOW = Array.from(ALL_SUB_IFRAME).map( |
| v => (v as HTMLIframeElementWithContentWindow).contentWindow |
| ); |
| |
| |
| ALL_SUB_WINDOW.forEach(v => v.__WUJIE?.inject?.idToSandboxMap?.clear()); |
| }; |
| |
| |
| refreshAllApp(); |
| |
| import { useRouter } from "vue-router"; |
| const router = useRouter(); |
| router.push('/'); |
可能会出现的问题
- 主应用销毁保活子应用后,若还处于子应用,在子应用中切换其他页面或者点击按钮等,子应用会失去响应,并提示以下错误。(因为沙箱已经销毁,所以就无响应了)

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏