qiankun
qiankun copied to clipboard
[Bug]点击浏览器的后退、前进,导致子应用挂载失败,报错信息:application 'xxx' died in status SKIP_BECAUSE_BROKEN
What happens?
-
application 'xxx' died in status SKIP_BECAUSE_BROKEN: [: Target container with xxx not existed while xxx mounting!
- 说明:容器写在了路由页面,但是并未使用任何路由过渡效果,https://qiankun.umijs.org/zh/faq#application-died-in-status-not_mounted-target-container-with-container-not-existed-while-xxx-mounting 提到的解决方案对此问题无效
最小可复现仓库
- 项目地址:https://github.com/EasonMar/qiankun-issue-demo
- 说明:项目使用 pnpm 构建 monorepo, 需要安装 pnpm, node >= v14.x.x
复现步骤,错误日志以及相关配置
- 进入项目根目录, pnpm i 安装依赖
- pnpm dev 本地运行所有应用
- 浏览器访问 http://localhost:3000/ 主应用(默认为login页)
- 点击
To APP1
跳转到 容器页面, 并加载子应用 - 点击浏览器 回退 按钮, 回退到 login 页
- 点击浏览器 前进 按钮, 前进到 容器页面, 此时子应用加载失败
对比实验 & 观察
- 将主、子应的路由模式从
hash
换成history
, 则不存在以上问题 - 移除
Login.vue
内的actions.setGlobalState
, 则不存在以上问题 - 使用
Router.push
或<router-link>
进行跳转, 则不存在以上问题 - 据观察, 出现此异常在于:点击浏览器 前进 按钮时, 容器页面还未渲染出来, 就触发了
qiankun
loader.js
中的render
方法, 导致render
方法内获取container
失败 - 手动刷新浏览器页面后, 微应用可以正常加载
相关环境信息
- qiankun 版本:v 2.7.0
- 浏览器版本:Edge 103.0.1264.77 (正式版本) (x86_64)、Chrome 103.0.5060.114(正式版本) (x86_64)
- NodeJS版本:v14.19.3
- 操作系统:win10 64位、macOS10.14.6
- 主、子应用均采用Vue3:vue3(3.2.31)、vue-router(4.0.14)、路由使用
hash
模式
https://router.vuejs.org/zh/guide/migration/index.html#%E5%88%A0%E9%99%A4%E4%BA%86-%EF%BC%88%E6%98%9F%E6%A0%87%E6%88%96%E9%80%9A%E9%85%8D%E7%AC%A6%EF%BC%89%E8%B7%AF%E7%94%B1
https://github.com/EasonMar/qiankun-issue-demo/blob/6c4730a7f6e08b48324f519ef58d5b9d67b7fe41/packages/main/src/router/index.js#L11
https://router.vuejs.org/zh/guide/migration/index.html#%E5%88%A0%E9%99%A4%E4%BA%86-%EF%BC%88%E6%98%9F%E6%A0%87%E6%88%96%E9%80%9A%E9%85%8D%E7%AC%A6%EF%BC%89%E8%B7%AF%E7%94%B1
https://github.com/EasonMar/qiankun-issue-demo/blob/6c4730a7f6e08b48324f519ef58d5b9d67b7fe41/packages/main/src/router/index.js#L11
跟这个没关系吧。。。去掉 * 问题一样存在
是不是hash模式的问题?
是不是hash模式的问题?
肯定跟 hash 模式 路由有关。问题是,如果非要用 hash 模式路由,该怎么解决呢。。。
请问问题解决了吗?遇到一样的问题了,不过我是history路由
分享一下我的解决方式,我使用的是hash模式, 报错之前我的url是这样:https:// ****/#login?a=b, 我把url改成https:// ****?a=b#login,然后点击前进后退就不报错了。具体原因目前未知。
我也遇到类似的问题,这个问题解决了嘛
我的是history路由,在子应用界面点击浏览器自带的后退后再点击前进,就打不开了 Uncaught Error: application 'web-exp' died in status NOT_MOUNTED: [qiankun]: Target container with #qiankun-container not existed while web-exp mounting!
这个问题不打算解决了嘛
我的处理方法是,把挂载的节点(#container)放在路由同级获取其他位置,避免在路由刷新之后,dom实例重新生成
...
<div#conainer />
<RouterView />
...
请问解决方案是什么呀,试了各种办法都无效
解决了吗
蹲下方案
mark 试了下demo,将主、子应的路由模式从 hash 换成 history,也会存在以上问题
只能把container 放在外面,和router-view同一级,微应用离开 container 元素也不移除