前言
建议主应用使用history模式,微应用使用hash模式。
主应用
先使用VUE CLI创建项目
注意要选择router组件
安装qiankun
按如下创建目录
其中
- 微应用出口文件
index.js
- 路由文件
micro_app_router.js
- 配置函数文件
micro_app_setting.js
micro_app_router.js
1 2 3 4 5 6 7 8 9 10
| const micro_app_router = [ { name: "child", url: "//localhost:9001", menuName: "子应用", }, ]; export default micro_app_router;
|
micro_app_setting.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import $microAppRouter from "./micro_app_router";
const micro_app_setting = {}; export default micro_app_setting;
micro_app_setting.microApps = () => { let apps = []; $microAppRouter.map((item) => { if (!item.hidden) { apps.push({ name: item.name, entry: item.url, container: `#${item.name}`, activeRule: `/${item.name}`, ...item, }); } }); return apps; };
|
index.js
1 2 3 4 5 6 7 8 9
| import { registerMicroApps, start } from "qiankun";
import $microAppSetting from "./micro_app_setting";
registerMicroApps($microAppSetting.microApps());
start();
|
main.js上最上方添加
1 2
| import "./assets/utils/micro/index.js";
|
App.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <template> <!-- 主应用dom id 不能与子应用dom id 重复 --> <div> <!-- 主应用 --> <a href="/">主应用</a> <!-- 子应用 --> <a v-for="item in microAppDom_Router" :key="item.name" :href="`/${item.name}/`" >{{ item.menuName }}</a > <!-- 主应用路由出口 --> <router-view></router-view>
<!-- 微应用dom容器 --> <div v-for="item in microAppDom_Router" :key="item.name" class="microAppBox" :id="item.name" ></div> </div> </template> <script> // 引入子应用路由 import $microAppRouter from "./assets/utils/micro/micro_app_router"; export default { name: "Home", data() { return { // 默认路由 activeIndex: "/", // 微应用容器及路由list microAppDom_Router: $microAppRouter, }; }, created() {}, }; </script>
|
微应用
项目根目录中添加vue.config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const packageName = require("./package.json").name; module.exports = { devServer: { port: 9001, headers: { "Access-Control-Allow-Origin": "*", }, }, configureWebpack: { output: { library: `${packageName}-[name]`, libraryTarget: "umd", jsonpFunction: `webpackJsonp_${packageName}`, }, }, };
|
src目录下添加public-path.js
1 2 3
| if (window.__POWERED_BY_QIANKUN__) { __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__; }
|
package.json中添加
1 2 3 4 5 6 7
| { "eslintConfig": { "globals": { "__webpack_public_path__": true } } }
|
main.js按如下修改
为了避免根 id #app 与其他的 DOM 冲突,需要限制查找范围。
主要是判断是否是在qiankun中打开是否渲染,以及导出qiankun生命周期需要的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import Vue from "vue"; import App from "./App.vue"; import router from "./router"; import store from "./store";
Vue.config.productionTip = false;
let instance = null;
function render(props) { if (props) { console.log(props); } instance = new Vue({ router, store, render: (h) => h(App), }).$mount("#app"); }
if (!window.__POWERED_BY_QIANKUN__) { render(); }
export async function bootstrap(props) { console.log(props); }
export async function mount(props) { render(props); }
export async function unmount() { instance.$destroy(); instance.$el.innerHTML = ''; instance = null; router = null; }
export async function update(props) { console.log("update props", props); }
|
路由文件中
1 2 3 4 5
| const router = new VueRouter({ mode: "hash", base: window.__POWERED_BY_QIANKUN__ ? "/child/" : "/", routes, });
|
注意
当微应用为hash模式时,base可以不用设置。