前端使用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;
}






扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论