前端使用qiankun搭建微应用框架
1、主应用配置
1.1 安装qiankun插件
yarn add @umijs/plugin-qiankun -D
1.2 在主应用中配置子应用
在配置文件config中配置qiankun相关参数
//config.ts
import micro from './micro';
const { REACT_APP_ENV } = process.env;
export default defineConfig({
qiankun: micro[REACT_APP_ENV || 'dev'],
}
在micro文件中根据开发环境、测试环境、生产环境分别配置不同的参数
// micor.ts
export default {
dev: {
master: {
// 注册子应用信息
apps: [
{
name: 'vue', // 唯一 id
entry: '//localhost:7105', // html entry
},
],
},
},
test: {
master: {
// 注册子应用信息
apps: [
{
name: 'vue', // 唯一 id
entry: 'https://vue.XXXX.com', // html entry
},
],
},
},
prod: {
master: {
// 注册子应用信息
apps: [
{
name: 'vue', // 唯一 id
entry: 'https://vue.XXXX.cn', // html entry
},
],
},
}
}
1.3 通过路由绑定方式装载子应用
// routes.ts
export default [
name: 'vue',
path: MICRO_VUE_ACTIVE_RULE,
microApp: 'vue',
microAppProps: {
autoSetLoading: true,
},
routes: [
{
name: 'home',
path: `${MICRO_VUE_ACTIVE_RULE}/dashboard/analysis`,
microApp: 'vue',
},
{
name: 'about',
path: `${MICRO_VUE_ACTIVE_RULE}/about/index`,
microApp: 'vue',
},
]
]
2、子应用配置
2.1 在src目录下增加public-path.js文件
// public-path.js
if (window.__POWERED_BY_QIANKUN__) {
// eslint-disable-next-line no-undef
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
2.2 修改入口文件main.ts
// main.ts
import './public-path';
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from './App.vue';
import routes from './router';
import store from './store';
Vue.config.productionTip = false;
let router = null;
let instance = null;
// 渲染
function render(props = {}) {
const { container } = props;
router = new VueRouter({
base: window.__POWERED_BY_QIANKUN__ ? '/app-vue/' : '/',
mode: 'history',
routes,
});
instance = new Vue({
router,
store,
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('[vue] vue app bootstraped');
}
/**
* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
*/
export async function mount(props) {
console.log('[vue] props from main framework', props);
render(props);
}
/**
* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
*/
export async function unmount() {
instance.$destroy();
instance.$el.innerHTML = '';
instance = null;
router = null;
}