qiankun 笔记

127 阅读1分钟

主应用

1.安装qiankun

$ yarn add qiankun # 或者 npm i qiankun -S

2.在主应用中注册微应用

在入口文件(main.js中)

import Vue from "vue"
import App from "./App.vue"
import router from "./router"
import { registerMicroApps, start } from "qiankun"

Vue.config.productionTip = false

new Vue({
    router,
    render: (h) => h(App),
}).$mount("#app")

registerMicroApps([
    {
        name: "vueApp", // 微应用的名称,微应用之间必须确保唯一
        entry: "//localhost:8080", // 微应用的入口
        container: "#container",  // 微应用的容器节点的选择器或者 Element 实例,可以将主应用的app的id设置为container
        activeRule: "/app-vue",  // 微应用的激活规则。
       // 例如:http://localhost:8081/app-vue
    },
])
// 启动 qiankun
start()

微应用

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

微应用需要在自己的入口 js (通常就是main.js) 导出 bootstrapmountunmount 三个生命周期钩子,以供主应用在适当的时机调用。

import Vue from "vue"
import App from "./App.vue"
import router from "./router"
Vue.config.productionTip = false

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

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()
}
/**
 * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
 * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
 */
export async function bootstrap () {
    console.log("react app bootstraped")
}

/**
 * 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
 */
export async function mount (props) {
    console.log("[vue] props from main framework", props)
    render(props)
}

/**
 * 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
 */
export async function unmount (props) {
    instance.$destroy()
    instance.$el.innerHTML = ""
    instance = null
    router = null
}

/**
 * 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
 */
export async function update (props) {
    console.log("update props", props)
}

router配置

import Vue from "vue"
import VueRouter from "vue-router"

Vue.use(VueRouter)

const routes = []

const router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? "/app-vue/" : "/",
    mode: "history",
    routes,
})

export default router

2. 配置微应用的打包工具

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

const { name } = require('./package')
module.exports = {
    devServer: {
        headers: {
            'Access-Control-Allow-Origin': '*',
        },
    },
    configureWebpack: {
        output: {
            library: `${name}-[name]`,
            libraryTarget: 'umd', // 把微应用打包成 umd 库格式
            jsonpFunction: `webpackJsonp_${name}`,
        },
    },
}