搭建步骤
一、主应用搭建
-
安装 npm i qiankun -S (我用的2.7.0)
-
主应用注册子应用
新建文件singSpa.js import { registerMicroApps, start, } from "qiankun" export default function (apps: []) { registerMicroApps(apps, { beforeLoad: () => { // 加载微应用前}, beforeMount: () => { // 渲染微应用前}, afterMount: () => {}, }); // 是否开启预加载,配置为 true 会在第一个微应用 mount 完成后开始预加载其他微应用的静态资源 start({prefetch:false,jsSandbox:true}) }调用配置(我是在layout的router-view处调用的) import startQiankun from "@/singSpa"; const apps=[{ name:'xx-app',//跟子应用package的name保持一致 entry:'//localhost:8081',//子应用入口 container:'#appContainer',//微应用挂载节点 activeRule:'#/xx-app',//微应用触发的路由规则 props:{...},//传递给子应用的数据(共享状态也可以使用initGlobalState传递) }] if(!window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__){ startQiankun(apps) }else{ location.reload() }
二、子应用搭建
**main.js添加**
export async function bootstrap(props={}){
}
//应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
export async function mount(props){
render(props)
}
//应用每次 切出/卸载 会调用的方法,通常在这会卸载微应用的应用实例
export async function unmount(){
instance.$destroy() //instance=new Vue(...)
instance=null
}
if(!window.__POWERED_BY_QIANKUN__){
//子应用独立运行时
render()
}
**vue.config.js配置**
module.exports={
publicPath:'//localhost:8081',
devServer:{
port:8081,
// 关闭主机检查,使微应用可以被 fetch
disableHostCheck: true,
// 配置跨域请求头,解决开发环境的跨域问题
headers:{
"Access-Control-Allow-Origin": "*",
},
configureWebpack: {
resolve: { alias: { "@": path.resolve(__dirname, "src"), }, },
output: {
// 微应用的包名,这里与主应用中注册的微应用名称一致
library: "xx-app",
// 将你的 library 暴露为所有的模块定义下都可运行的方式
libraryTarget: "umd",
// 按需加载相关,设置为 webpackJsonp_${appName}
jsonpFunction: `webpackJsonp_xx-app`,
},
},
}
三、遇到的问题:
- Application died in status NOT_MOUNTED: Target container with #container not existed while xxx mounting!-----主应用跟子应用的app.vue 的id不能一样
- Application died in status NOT_MOUNTED: Target container with #container not existed while xxx loading-----container的id没找着,犯了一个愚蠢的错误,写成了id="#xxx"!
- 主子应用 props 引入无效--因为子应用main.js导出了vue实例是在bootstrap生命周期前 ,就生成了实例----别导出就行了
- 子应用会影响主应用某些页面样式----后面加了点什么东西自动修复了---
- 路由的改造 采用hash模式,子主应用同时启动时,子应用devserver的代理不生效----写在请求配置文件里面,判断window.POWERED_BY_QIANKUN 独立运行与作为子应用时分情况
-
vue项目router报错:TypeError: _router.default.addRoute is not a function---换个vue-router 版本号就行了 3.5.1