qiankun微前端主子应用通信方案

2024-08-27 08:58

本文主要是介绍qiankun微前端主子应用通信方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概念

目前有关微前端通信的方案无非两种:

使用qiankun提供的api-initGlobalState进行通信;
通过在主、微应用中定义状态管理类的方式进行通信;

下面我们就第一种方案进行详细讲解,毕竟官方提供了实现方案。达到的效果如下:

主应用作为中转,进行状态承接与派发;
各个微应用不仅能获取主应用的状态变更,还能同步自身状态到主应用;
微应用能独立运行;

二、主应用

我们先来看看initGlobalState(state) 这个api的具体信息:

1.用法:在主应用中使用,定义全局状态,微应用通过props传参获取;
2.返回:
onGlobalStateChange(callback, Immediately)在当前应用监听全局状态变化;
setGlobalState(state)按照一级属性进行状态设置,微应用只能修改一级属性;
offGlobalStateChange()移除当前的状态监听,微应用在unmount时默认调
用;
下面我们在主应用中进行初始化:

import { registerMicroApps, start, setDefaultMountApp, initGlobalState } from 'qiankun'const { onGlobalStateChange } = initGlobalState({iptValue: ''})
onGlobalStateChange((state, prev) => {// state: 变更后的状态; prev 变更前的状态console.log('main-app onGlobalStateChange', state, prev)
})

这里我们只简单定义了一个一级属性iptValue,用于在微应用中绑定表单。同时监听状态变化,打印相关信息。

三、微应用

主应用中状态初始化成功后,整个state状态由qiankun框架内部进行维护,开发者通过官方提供的api进行state的修改、追踪。

因此在每一个微应用中,我们需要做的事情有两个,即:

1.同步主应用状态变化到微应用;
2.同步微应用状态变化到主应用;

下面分别讲解在vue、react中如何进行状态的双向同步。

3.1 vue微应用
我们需要在之前vue入口文件main.js中进行扩展,修改render(props)函数。微应用内部状态管理我们使用vuex,通过vuex提供的api进行状态双向同步。

第一步新建store/index.js文件:

const state = {store: {}
}const getters = {iptValue: state => state.store.iptValue
}const mutations = {initStore(state, data) {state.store = data},setStore(state, data) {state.store = {...state.store,...data}}
}const actions = {}export default {actions,getters,state,mutations,modules: {},strict: false,plugins: [],
}

这里我们只是定义了store的结构,但是并没有生成vuex的实例对象。

第二步初始化微应用store,绑定状态同步逻辑:

import Store from './store/index'/*** 初始化主微应用通信逻辑* 1.主应用状态变更同步到微应用;* 2.微应用状态变更同步到主应用;*/
function initStore(props) {const myPlugin = store => {let prevState = _.cloneDeep(store.state)// 当 store 初始化后调用store.subscribe((mutation, state) => {// 每次 mutation 之后调用let nextState = _.cloneDeep(state)if(JSON.stringify(nextState) !== JSON.stringify(prevState)) {prevState = nextState// 微应用中store变更后,将状态更新到主应用props.setGlobalState &&props.setGlobalState({...state.store})}})}const storeInstance =  new Vuex.Store({...Store,plugins: [myPlugin]})// 主应用状态变化后,同步到微应用props.onGlobalStateChange &&props.onGlobalStateChange((state, prev) => {storeInstance.commit('initStore', state)console.log('vue-app onGlobalStateChange', state, prev)}, true)return storeInstance
}

主应用状态变更同步到微应用比较简单,在onGlobalStateChange方法中调用commit进行同步即可。

微应用状态变更同步到主应用我们使用setGlobalState()方法,关键是要实时监听微应用状态变更。这里我们使用vuex插件提供的派发功能subscribe,同步之前会比较两次状态是否存在变更,否则会陷入死循环。

第三步为vue实例绑定store:

function render(props = {}) {...store = initStore(props)instance = new Vue({router,store,render: h => h(App),}).$mount(container ? container.querySelector('#app') : '#app')
}

这样vue微应用状态同步逻辑就完成了,就像平时使用vuex一样进行管理即可。当然主、微应用通信的这一份状态最好是单独进行维护的,不应该和微应用内部业务逻辑状态相关联,我们可以使用vuex的modules功能进行实现,这里就不再赘诉有需要再更新。

3.2 react微应用
react的实现逻辑和vue都一样,只是不同技术栈代码写法不一样而已,react中我们使用mobx、mobx-react进行状态管理。mobx开箱即用支持装饰器语法,天然存在状态隔离,和react-hook完美搭配。

第一部新建store文件:

import { observable, computed, action, reaction } from 'mobx'
import _ from 'lodash'
import { MainStoreModel } from '../model/mainApp'class MainApp {static setGlobalState: Function@observable preStore: MainStoreModel = {}@observable store: MainStoreModel = {}constructor() {}@computed get iptValue() {return this.store.iptValue}@actioninitStore(data: MainStoreModel) {this.store = data}@actionsetStore(data: any) {const prev = _.cloneDeep(this.store)this.store = {...prev,...data}}
}const mainApp = new MainApp()export { mainApp, MainApp 
}

第二步修改入口文件,初始化state同步逻辑

import { mainApp, MainApp } from './store/mainApp'/*** 初始化主微应用通信逻辑* 1.主应用状态变更同步到微应用;* 2.微应用状态变更同步到主应用;*/
function initStore(props: any) {// 将setGlobalState方法绑定到类MainApp静态属性上MainApp.setGlobalState = props.setGlobalState ? props.setGlobalState : null// 主应用状态变更同步到微应用props.onGlobalStateChange &&props.onGlobalStateChange((state: MainStoreModel, prev: MainStoreModel) => {mainApp.initStore(state)console.log('react-app onGlobalStateChange', state, prev)}, true)
}export async function mount(props: any) {render(props)
+  initStore(props)
}

主应用状态同步到微应用逻辑和vue大同小异。不同的是,我们将setGlobalState方法绑定在MainApp类的静态属性上,微应用状态同步到主应用时会用到。

第三步reaction同步微应用状态到主应用

我们使用mobx中reaction的特性用于监听store的变化,来实现我们需要的逻辑。

class MainApp {  ...appReaction = reaction(() => this.store,store => {const nextState = _.cloneDeep(store)const prevState = _.cloneDeep(this.preStore)if(JSON.stringify(nextState) !== JSON.stringify(prevState)) {MainApp.setGlobalState&&MainApp.setGlobalState(nextState)this.preStore = nextState}})
}

同步逻辑同样需要比较变更前后两份深拷贝状态的差异,防止陷入死循环。

这篇关于qiankun微前端主子应用通信方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111214

相关文章

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本