Skip to content

乾坤

主应用配置

ts
// 在主应用中注册微应用
import { registerMicroApps, start } from 'qiankun'

registerMicroApps([
    {
        name: 'react app', // app name registered
        entry: '//localhost:7100',
        container: '#yourContainer',
        activeRule: '/yourActiveRule',
    },
    {
        name: 'vue app',
        entry: { scripts: ['//localhost:7100/main.js'] },
        container: '#yourContainer2',
        activeRule: '/yourActiveRule2',
    },
])

start()

当微应用信息注册完之后,一旦浏览器的 url 发生变化,便会自动触发 qiankun 的匹配逻辑,所有 activeRule 规则匹配上的微应用就会被插入到指定的 container 中,同时依次调用微应用暴露出的生命周期钩子。

如果微应用不是直接跟路由关联的时候,你也可以选择手动加载微应用的方式:

ts
import { loadMicroApp } from 'qiankun'

loadMicroApp({
    name: 'app',
    entry: '//localhost:7100',
    container: '#yourContainer',
})

微应用

  1. 导出相应的生命周期钩子

    微应用需要在自己的入口 js (通常就是你配置的 webpack 的 entry js) 导出 bootstrap、mount、unmount 三个生命周期钩子,以供主应用在适当的时机调用。

    ts
    /**
     * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
    * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
    */
    export async function bootstrap() {
        console.log('react app bootstraped');
    }
    
    /**
    * 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
    */
    export async function mount(props) {
        ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));
    }
    
    /**
    * 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
    */
    export async function unmount(props) {
    ReactDOM.unmountComponentAtNode(
        props.container ? props.container.querySelector('#root') : document.getElementById('root'),
    );
    }
    
    /**
    * 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
    */
    export async function update(props) {
        console.log('update props', props);
    }
  2. 配置微应用的打包工具

    除了代码中暴露出相应的生命周期钩子之外,为了让主应用能正确识别微应用暴露出来的一些信息,微应用的打包工具需要增加如下配置:

    ts
    // webpack5
    const packageName = require('./package.json').name
    
    module.exports = {
        output: {
            library: `${packageName}-[name]`,
            libraryTarget: 'umd',
            chunkLoadingGlobal: `webpackJsonp_${packageName}`,
        },
    }

通信

initGlobalState(state)

主应用:

ts
import { initGlobalState, MicroAppStateActions } from 'qiankun'

// 初始化 state
const actions: MicroAppStateActions = initGlobalState(state)

actions.onGlobalStateChange((state, prev) => {
    // state: 变更后的状态; prev 变更前的状态
    console.log(state, prev)
})
actions.setGlobalState(state)
actions.offGlobalStateChange()

微应用:

ts
// 从生命周期 mount 中获取通信方法,使用方式和 master 一致
export function mount(props) {
    props.onGlobalStateChange((state, prev) => {
        // state: 变更后的状态; prev 变更前的状态
        console.log(state, prev)
    })

    props.setGlobalState(state)
}

Last updated: