vue+webpack+qiankun.js-初步运用

776 阅读2分钟

一、主应用

1.安装qiankun.js npm i qiankun -S

2.主应用封注册微应用并启动 (封装成qiankun.js在main.js中引用)

import { registerMicroApps, start } from "qiankun";

export const useQiankun = () => {
  const apps = [
    {
      name: "app", // 必选,微应用的名称,微应用之间必须确保唯一
      entry: "http://zhulifeng.laidan.com:8085", // - 必选,微应用的入口
      container: "#appContainer", // -必选,微应用的容器节点的选择器或者 Element 实例
      activeRule: "/app", // - 必选,微应用的激活规则
    },
    { 
        name: 'wechat', 
        entry: 'http://localhost:8087', 
        container: '#appContainer', 
        activeRule: '/wechat', 
    },
  ];

  registerMicroApps(apps, {
    beforeLoad: [
      (app) => {
        console.log(`${app.name}的beforeLoad阶段`);
      },
    ],
    beforeMount: [
      (app) => {
        console.log(`${app.name}的beforeMount阶段`);
      },
    ],
    _afterMount: [
      (app) => {
        console.log(`${app.name}的afterMount阶段`);
      },
    ],
    get afterMount() {
      return this._afterMount;
    },
    set afterMount(value) {
      this._afterMount = value;
    },
    beforeUnmount: [
      (app) => {
        console.log(`${app.name}的beforeUnmount阶段`);
      },
    ],
    afterUnmount: [
      (app) => {
        console.log(`${app.name}的afterUnmount阶段`);
      },
    ],
  });

  start();
};

3.main.js 中引用 为了确保装载子应用的容器已创建,我们需要在new Vue()之后,等DOM加载好了在注册并启动qiankun

//main.js
import { useQiankun } from "./utils/qinakun";


const vueApp = new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

vueApp.$nextTick(() => {
  useQiankun()
})

4.使用vue-admin也可以在layou-Appmain.vue中引用

<script>
import { start } from 'qiankun';

export default {
  name: 'AppMain',
  computed: {
    key() {
      return this.$route.path
    }
  },
  mounted() {
    if(!window.isQiankunStart){
      window.isQiankunStart = true;
      start();
    }
  },
}
</script>

5.主应用路由的改造 (vue-admin项目)

//注释404否则微应用的路由跳转会被404拦截导致微应用加载失败
// {
    //     path: '*',
    //     redirect: '/404',
    //     meta: {
    //         roles: []
    //     },
    //     hidden: true
    // },
//微应用路由匹配
    {
        path: '/app/*',
        component: Layout,
    },
    {
        path: '/wechat/*',
        component: Layout,
    },

二、微应用改造 wechat

1.在src目录下新增文件public-path.js,主要用于修改子项目的publicPath

if (window.__POWERED_BY_QIANKUN__) {
  // eslint-disable-next-line no-undef
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

2.在main.js,引入public-path.js 并配合主项目导出single-spa需要的三个生命周期。注意:路由实例化需要在main.js里面完成,以便于路由的销毁,所以路由文件只需要导出路由配置即可(原模板导出的是路由实例)

import './public-path';
import routes from './router';

let router = null;
let instance = null;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? '/wechat/' : '/',
    mode: 'history',
    routes,
  });


  instance = new Vue({
    router,
    store,
    render: (h) => h(App),
  }).$mount(container ? container.querySelector('#wechatApp') : '#wechatApp');
  // index.html 里面的 id 需要改成 appVueHash,否则子项目无法独立运行
}


// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  // 全局变量来判断环境
  render();
}


export async function bootstrap() {
  console.log('[vue] vue app bootstraped');
}
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;
}

3.修改打包配置文件webpack.base.conf.js ,output配置

const packageName = require('../package.json').name;


output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath,
    library: `${packageName}-[name]`,
    libraryTarget: 'umd',
  },

4.修改运行配置文件webpack.dev.conf.js ,允许跨域

devServer: {
    headers: {
    'Access-Control-Allow-Origin': '*'
    },
  },

三、qiankun.js BUG

1.主应用和微应用同时引用bable-polyfill 报错只能引用一个 删除主应用引用bable-polyfill 

image.png 解决:在webpack.base.conf.js删除babel-polyfill引用

/   entry: {
//     app: [ 'babel-polyfill''./src/main.js']
//   },
entry: {
    app: ['./src/main.js']
  },

2.引用官网的output.jsonpFunction 配置报错 注释掉 推断多个应用引用统一名称报错

image.png 3.[import-html-entry]: error occurs while executing entry script 出现报错的场景: 子应用使用 CND 的方式引用依赖时,集成到基座应用中报错

image.png

4.路由配置错误导致页面未加载 如404页面拦截,ip端口配占用和配置不一样,主应用id和微应用id相同等

 <script src="../../../static/xlsx.core.min.js" ignore></script>
    <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-4.10.0.min.js" ignore></script>

qiankun.js常见问题和交流

官网:qiankun.umijs.org/zh/faq 

issues(github.com/umijs/qiank…)

qiankun 技术圆桌:www.yuque.com/kuitos/gky7… 

钉钉qiankun交流群:34805470