主应用

1. 引入并注册

import { registerMicroApps, start } from 'qiankun'

// 注册微应用
registerMicroApps([
  {
    name: 'thd-psy-web', 
    entry: '/thd-sz-web/child/thd-psy-web/',
    container: '#thd-psy-web',
    activeRule: '/thd-sz-web/thd-psy-web/'
  }
])

 start() // 开启

当微应用信息注册完之后,一旦浏览器的 url 发生变化,便会自动触发 qiankun 的匹配逻辑,所有 activeRule 规则匹配上的微应用就会被插入到指定的 container 中,同时依次调用微应用暴露出的生命周期钩子。

 

2. 路由配置

一般来说建议主应用使用history模式 , qiankun的官方教程也是这样推荐的

// 路由配置
const options = {
  mode: 'history',
  base: '/thd-sz-web/', 
  routes: [
  {
      path: '/thd-psy-web/',
      name: '心理',
      component: () => import('@/pages/xxx')
     }
  ]
}

// 记得在路由页面中留出微应用挂载的DOM节点 并且 ID和 container: '#thd-psy-web'中值相同 例如 <div id="thd-psy-web"></div>

需要注意的是这里的base要与项目的真实访问地址相同 例如我的主应用项目地址是 http://192.168.3.92/thd-sz-web/ base就是 '/thd-sz-web/' 这个根据项目自行配置 如果直接部署在根目录下,这里base就是'/'

3. webpack 打包相关

publicPath: /thd-sz-web

根据个人项目情况更改 publicPath

 

 

子应用 

1. 新建 public-path.js 文件 并在main.js中引用

// qiankun Vue子应用配置
if (window.__POWERED_BY_QIANKUN__) {
  // eslint-disable-next-line no-undef
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

 

2. qiankun相关配置

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();
}

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;
}

router 可以根据自己的项目自行选择挂载方式 

 

3.webpack打包相关 这里是Vue-cli中的配置方式

configureWebpack: config => {
    // qiankun start
    config.output.library = `${name}-[name]`
    config.output.libraryTarget = 'umd' // 把微应用打包成 umd 库格式
    config.output.jsonpFunction = `webpackJsonp_${name}`
    // qiankun end
}
// publicPath 地址要与主应用中的 entry真实地址相同

 publicPath:'/thd-sz-web/child/thd-psy-web/'

 

至此打包相关的准备工作做完了,开始部署上线 , 也是其中的难点, 因为本人对nginx配置不是特别了解所以踩了不少坑 折腾的几天才弄好. 自己部署上线需要的Nginx有一定的了解 简单的Nginx基础配置要会, 简单的命令行要知道, Nginx重启 , Vim编辑等等

 

部署上线

1. 把打包好的文件放到服务器中nginx 目录下的html 文件夹中

 

└── thd-sz-web/                     # 根文件夹
    |
    ├── child/                # 存放所有微应用的文件夹
    |   ├── thd-psy-web/         # 存放微应用 vue-hash 的文件夹
    ├── index.html            # 主应用的index.html
    ├── css/                  # 主应用的css文件夹
    ├── js/                   # 主应用的js文件夹

 

2. 通过xshell等工具连接到服务器找到 nginx.conf 文件并编辑

 

cd /usr/local/nginx/conf

vim nginx.conf

 

3 .加入以下配置

root /home/thd/html/thd-sz-web;
index index.html index.html;

# 主应用基座
    location / {
        root  /home/thd/html/thd-sz-web;
        try_files $uri $uri/ /index.html last;
        index index.html;
    }
    # 微应用
    location  /thd-sz-web/child/thd-psy-web {
       root  /home/thd/html;
        try_files $uri $uri/ /index.html last;
        index index.html;
    }


  # 主应用
    location /thd-sz-web {
        root  /home/thd/html;
        try_files $uri $uri/ /index.html last;
     index index.html;
    }
# vue 思政2.0 微应用 解决页面刷新404问题
    location /thd-sz-web/thd-psy-web/  {
        root  /home/thd/html;
        try_files  /thd-sz-web/index.html last;
        index index.html;
    }

 

至此微应用部署完毕 刷新也不会404

 

其他问题记录 

1. 主应用和微应用最好不用选用同一款UI框架 主应用会污染子应用的样式 , 有解决方法 . 但是能从根源避免是最好的

以 antd 为例:配置 webpack 修改 less 变量

{
  loader: 'less-loader',
  options: {
    modifyVars: {
      '@ant-prefix': 'main',
    },
    javascriptEnabled: true,
  },
}

配置 antd ConfigProvider

import { ConfigProvider } from 'antd';

export const MyApp = () => (
  <ConfigProvider prefixCls="main">
    <App />
  </ConfigProvider>
);

 

2. 主应用和子应用 不能多次使用 babel-polyfill  , babel-polyfill 不支持引用多次(主应用和子应用分别引用了一次),可以改用 idempodent-babel-polyfill

 

qiankun 框架并不是开箱即用 里面有很多坑, 建议使用者多看官方文档 加官方群去了解