- Published on
Qiankun微前端中的应用通信
- Authors
- 作者
- Michael
应用间通信
对于微前端来说,应用间通信(主要为主应用-微应用)往往是架构设计之初就要考虑的核心需求。qiankun 自身在通信方面并不提供完整的解决方案,更多的是提供 api,通过这些 api 可以快捷地实现通讯功能,但是对于更丰富、未来可能更复杂地业务需求,我们还可以使用这些方案:
Actions 通信
原理
全局状态池和观察者函数进行应用间通信 qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信,该实例有三个方法,分别是:
- setGlobalState:设置 globalState - 设置新的值时,内部将执行 浅检查,如果检查到 globalState 发生改变则触发通知,通知到所有的 观察者 函数。
- onGlobalStateChange:注册 观察者 函数 - 响应 globalState 变化,在 globalState 发生改变时触发该 观察者 函数。
- offGlobalStateChange:取消 观察者 函数 - 该实例不再响应 globalState 变化。
优缺点:
- 优点:
- 使用简单;
- 官方支持性高;
- 适合通信较少的业务场景;
- 缺点:
- 子应用独立运行时,需要额外配置无 Actions 时的逻辑;
- 子应用需要先了解状态池的细节,再进行通信;
- 由于状态池无法跟踪,通信场景较多时,容易出现状态混乱、维护困难等问题;
Shared 通信
原理
主应用基于 redux 维护一个状态池,通过 shared 实例暴露一些方法给子应用使用。同时,子应用需要单独维护一份 shared 实例,在独立运行时使用自身的 shared 实例,在嵌入主应用时使用主应用的 shared 实例,这样就可以保证在使用和表现上的一致性。
优缺点
- 优点:
- 可以自由选择状态管理库,更好的开发体验。 - 比如 redux 有专门配套的开发工具可以跟踪状态的变化。
- 子应用无需了解主应用的状态池实现细节,只需要了解 shared 的函数抽象,实现一套自身的 shared 甚至空 shared 即可,可以更好的规范子应用开发。
- 子应用无法随意污染主应用的状态池,只能通过主应用暴露的 shared 实例的特定方法操作状态池,从而避免状态池污染产生的问题。
- 子应用将具备独立运行的能力,Shared 通信使得父子应用有了更好的解耦性。
- 缺点:
- 主应用需要单独维护一套状态池,会增加维护成本和项目复杂度;
- 子应用需要单独维护一份 shared 实例,会增加维护成本;