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微前端主子应用通信方案相关推荐
- qiankun微前端应用间通信实现
转自基于 qiankun 的微前端最佳实践(图文并茂) - 应用间通信篇 - 掘金本系列其他文章计划一到两个月内完成,点个 关注 不迷路. 本文是基于 qiankun 的微前端最佳实践系列文章之 应用 ...
- qiankun微前端学习
微前端学习(qiankun.singleSpa) 一.微前端的优势 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略 几个核心价值:技术栈无关 ...
- qiankun微前端实践
qiankun微前端方案实践 qiankun 微前端方案实践 创建qiankun主项目 引入react-app-rewired 配置多环境 配置proxy 创建react子项目 创建vue子项目 个人 ...
- vue项目集成乾坤(qiankun)微前端
vue项目集成qiankun微前端 集成乾坤微前端主应用: 1.安装 2.main.js中进行配置 3.配置路由 4.将主应用路由模式设置为history模式 子应用中配置(子应用无需安装乾坤) 1. ...
- qiankun微前端落地实践
qiankun微前端落地实践 背景 A项目集成了多条业务线的项目,但是共同使用一个git仓库和一套发布流水线,代码组织比较混乱.本次需要引入一个新的业务线,如果直接在A项目开发,将导致原项目更加复杂, ...
- qiankun微前端:script xxxxxx replaced by qiankun或script xxxxxxxxxx replaced by import-html-entry
qiankun微前端 1.问题:script xxxxxx replaced by qiankun或script xxxxxxxxxx replaced by import-html-entry 2. ...
- qiankun 微前端_微前端方案 qiankun(实践及总结)
❝ 作者:沉末_ 链接:https://juejin.im/post/5ed73b73e51d4578724e3fa4 ❞ 什么是微前端? 我们先来看两个实际的场景: 1. 复用别的的项目页面 通常, ...
- qiankun 微前端_看滴普大前端是如何玩转基于“qiankun”(乾坤)的微前端架构的...
前言 「微前端」可以算是 2019年前端技术领域中最热门的话题.各个大厂也纷纷贡献出了自己的解决方案和实践分享.滴普科技作为一家致力于为企业提供数字化转型服务的技术公司,前端也需要灵活聚合,快速复用, ...
- 微前端与项目实施方案研究
一.前言 微前端(micro-frontends)是近几年在前端领域出现的一个新概念,主要内容是将前端应用分解成一些更小.更简单的能够独立开发.测试.部署的小块,而在用户看来仍然是内聚的单个产品.微前 ...
最新文章
- 带你了解“比特币黄金”和SegWit2x分叉
- ICLR 2019论文投稿近1600篇,强化学习最热门
- Android- assent和raw的区别
- [UWP小白日记-3]记账项目-1
- 白苹果了怎么强制开机_iphone X 手机进水开机卡白苹果怎么回事?
- 收好这张MySQL导图,全是知识点!
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- 读掘金小册组件精讲总结1
- 百万级MySQL的数据量,该如何快速的完成数据迁移?
- 【JAVA】Collections.sort()实现动态数组自定义排序
- 尽量用iterator代替const_iterator
- Spring中注册Bean的方式有哪些?
- python 拼音搜索中文_JS实现输入拼音搜索中文列表
- BZOJ 3717: [PA2014]Pakowanie
- 叉乘应用:判断三角形方向正反/三个点顺时针逆时针
- Python 弹出提示框
- [IOS/Swift]'Project Name' was compiled with optimization
- 【CAD-Web】CAD/DWG的Web化
- ppt演示文档如何瘦身
- 【异构图神经网络】HGraph || 附:AI研究生时间规划 建议(研一、研二、研三)