vue qiankun 主应用访问子应用 不显示也不报错

业务背景:原内管平台中子系统越来越多,项目越来越大,打包发布需要十几分钟,本地运行npm run dev都非常容易因为内存不够导致崩溃(虚拟桌面内存就8G),业务打算将渠道管理平台中的一个子系统独立出来,用qiankun改成微前端架构。


介绍 - qiankunhttps://qiankun.umijs.org/zh/guide

遇到的问题:从主应用访问子应用时,控制台不报错,但是页面显示空白。

之前在测试demo中成功搭建过一次,由于过了两周印象不是很深刻,打算再重新搭建一次demo,主应用和子应用各自都可以正常访问,从主应用访问子应用时,发现显示显示一片空白,并且不报错,但是切换路由访问不同菜单,控制台有日志打印(控制台无日志打印见情况②),如下图。

推断main.js、跨域之类的地方应该是没有问题的,肯定是哪个奇怪的地方有问题。

最终对比两套demo反复控制变量尝试,成功发现问题居然出在了容器命名上。

错误原因可能有两种情况:

情况①:主应用中main.js中注册子应用的container容器ID和子应用中本身container容器ID不可相同:

我为了统一方便代码阅读,在主应用和子应用中容器id都定义为contractCenter,没想到这还出了问题。

解决办法:修改子应用中的容器名。

子应用中共有3处需要修改(我将子应用中容器id由contractCenter修改为sub):

修改之后,就可以正常访问了。

另外有些情况下

不显示内容可能是因为路由不一致。比如子应用中首页是根路径

 但是主应用访问子应用的路由为: localhost:8083/#/contractCenter

这里子应用的首页路由应该和主应用中的一致:

 于是将子应用中首页的路由也改为:

 即可正常显示了。

或者

直接在app.vue中加入醒目提示,只要加载成功就显示,不管路由是否一致,方便排查问题:

访问不到首页内容,但是也会显示东西:

情况②:完全没有任何反应。

访问子应用不报错,控制台也无输出,完全没任何反应,这种情况基本就是没匹配到子应用路由。这种情况好像仅会出现在vue2中,并且用的是hash模式,我用别人的vue3demo,没加也没出问题。

先自己检查url是否对应,如果确认是对应一致的,用getActiveRule来匹配hash路由。

const getActiveRule = (hash) => (location) => location.hash.startsWith(hash)

之后就可以正常触发了。

有需要项目Demo源码的,我把之前鼓捣的简易版本翻了出来,各位观众老爷可以参考参考,能跑就行:

GitHub - fyljy574/qiankun-DemoContribute to fyljy574/qiankun-Demo development by creating an account on GitHub.https://github.com/fyljy574/qiankun-Demo

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
在使用 Qiankun 开发应用时,如果应用使用的是 hash 模式路由,需要在应用的入口文件中,手动初始化路由。 在 Vue应用中,可以在 `main.js` 文件中进行路由初始化,具体实现如下: ``` import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false // 手动初始化路由 let instance = null function render(props = {}) { const { container } = props instance = new Vue({ router, render: h => h(App) }).$mount(container ? container.querySelector('#app') : '#app') } // 如果不是作为应用使用,则直接渲染应用 if (!window.__POWERED_BY_QIANKUN__) { render() } // 导出生命周期钩函数 export async function bootstrap() {} export async function mount(props) { // 初始化路由 render(props) } export async function unmount() { // 销毁实例 instance.$destroy() instance = null } ``` 在这里,我们通过 `render` 函数手动初始化了路由,并在 `mount` 钩中再次调用 `render` 函数,以保证应用在挂载时能够正确初始化路由。 另外,需要注意的是,在切换应用时,应用会将当前的路由信息传递给应用,因此,应用需要在接收到这些信息后自行进行路由跳转。你可以通过监听 `qiankun` 的 `routeChange` 事件来实现这个功能,具体实现如下: ``` import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false // 手动初始化路由 let instance = null function render(props = {}) { const { container } = props instance = new Vue({ router, render: h => h(App) }).$mount(container ? container.querySelector('#app') : '#app') } // 如果不是作为应用使用,则直接渲染应用 if (!window.__POWERED_BY_QIANKUN__) { render() } // 导出生命周期钩函数 export async function bootstrap() {} export async function mount(props) { // 初始化路由 render(props) // 监听 routeChange 事件 props.onGlobalStateChange((state, prev) => { if (state.type === 'vue2_subapp_route_change') { const { path } = state.payload router.push(path) } }) } export async function unmount() { // 销毁实例 instance.$destroy() instance = null } ``` 在这里,我们通过 `props.onGlobalStateChange` 监听 `routeChange` 事件,并在事件回调函数中跳转路由。当应用切换路由时,会触发这个事件,从而实现路由跳转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风间琉璃c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值