qiankun默认提供可配置的引用加载方式, registerMicroApps 。 这种方式存在一些问题:
主应用路由
// /root/router.js
// 子应用配置
export const MICRO_CONF = [
{
name: 'app1',
entry: '//localhost:9001',
container: '#ROOT-CONTAINER-app1',
activeRule: '/home/app1',
},
{
name: 'app2',
entry: '//localhost:9002',
container: '#ROOT-CONTAINER-app2',
activeRule: '/home/app2'
},
{
name: 'app3',
entry: '//localhost:9003',
container: '#ROOT-CONTAINER-app3',
activeRule: '/home/app3',
}
]
// 手动控制应用加载
import {loadMicroApp} from 'qiankun';
// 缓存应用实例
const microList = new Map([])
// 当前应用配置
let current
const routes = [
{
path: '/',
redirect: {
path: '/home/*'
}
},
{
path: '/home/*',
name: 'Home',
component: Home,
}
]
const router = new VueRouter({
routes
})
router.beforeEach( async (to, from, next) =>{
const conf = MICRO_CONF.find(item => to.path.indexOf(item.activeRule) !== -1)
// 应用跳转
if(conf){
// 未切换子应用
if(current && current.activeRule === conf.activeRule ){
next()
return
}
const cacheMicro = microList.get(conf.activeRule)
// 已缓存应用
if(cacheMicro){
next()
return
}
// 未缓存应用
const micro = loadMicroApp({...conf, router})
microList.set(conf.activeRule, micro)
current = conf
next()
}
// 主应用内跳转
next()
})
因为需要缓存子应用,所以我们需要为每个子应用配置 keep-alive。 这里需要注意的地方是,需要将keep-alive 配置在子应用的 APP.vue 根路由下。 这里的子应用都配置在主应用的二,三级路由下,构造出的结构类似多级嵌套的父子路由关系。 所以这里子应用的 APP.vue 内的渲染入口变成了主应用的嵌套子路径, 2.0 使用方式
<keep-alive>
<router-view/>
</keep-alive>
3.0 使用方式
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" />
</keep-alive>
</router-view>
// micro-app1-vue3.0
// src/APP.vue
<template>
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" />
</keep-alive>
</router-view>
</template>
// micro-app2-vue2.0
// src/APP.vue
<template>
<keep-alive>
<router-view/>
</keep-alive>
</template>