qiankun - vite + vue3踩坑
环境:
主应用: vite + vue3 + ts
子应用: vite + vue3 + ts
搭建步骤 - 主应用:
1. 安装qiankun
yarn add qiankun
2.在入口文件中 注册子应用路由 (也可以单独写一个文件,在入口文件中调用)
import { registerMicroApps, start } from 'qiankun' const loader = (loading: boolean) => { console.log('loading', loading) }; // https://qiankun.umijs.org/zh // https://jwchan.cn/_posts/other/qiankun_micro_app.html#%E5%85%A5%E5%8F%A3%E6%96%87%E4%BB%B6-main-js const MicroConfig = [ //name: 微应用的名称, //entry: 微应用的入口, //container: 微应用的容器节点的选择器或者 Element 实例, //activeRule: 激活微应用的规则(可以匹配到微应用的路由), //loader: 加载微应用的状态 true | false { name: 'vue3', entry: 'http://localhost:6100', container: '#container', activeRule: '/#/vue3', loader }, ]; registerMicroApps(MicroConfig, { // qiankun 生命周期钩子 - 微应用加载前 beforeLoad: (app: any) => { console.log("before load+++++++++++", app.name); return Promise.resolve(); }, beforeMount: (app: any) => { console.log("before mount----------", app.name); return Promise.resolve(); }, // qiankun 生命周期钩子 - 微应用挂载后 afterMount: (app: any) => { console.log("after mount============", app.name); return Promise.resolve(); }, afterUnmount: (app: any) => { console.log("after unmount===+++++----", app.name); return Promise.resolve(); }, }); // 启动 qiankun start({ prefetch: false, // 开启预加载 sandbox: { experimentalStyleIsolation: true, // 开启沙箱模式,实验性方案 }, }); // 添加全局异常捕获 addGlobalUncaughtErrorHandler((handler) => { console.log("异常捕获", handler); });
搭建项目 - 子应用:
1. 安装vite-plugin-qiankun(qiankun官方不支持vite)需要安装插件
yarn add vite-plugin-qiankun
2. vite.config.js 添加相关配置
import qiankun from 'vite-plugin-qiankun' export default defineConfig({ plugins: [ vue(), qiankun('vue3', { useDevMode: true }) ], server: { ..., headers: { 'Access-Control-Allow-Origin': '*', // 主应用获取子应用时跨域响应头 }, } })
3. 入口文件:main.ts中添加 导出生命周期配置以及qiankun环境变量判断
renderWithQiankun: 为子应用导出一些生命周期函数 供主应用在特殊的时机调用
qiankunWindow: qiankunWindow.POWERED_BY_QIANKUN 可判断是否在qiankun环境下
// 入口文件处 : main.ts
import { renderWithQiankun, qiankunWindow, QiankunProps } from 'vite-plugin-qiankun/dist/helper' renderWithQiankun({ mount(_props) { console.log('mount'); }, bootstrap() { console.log('bootstrap'); }, unmount(_props: any) { console.log('unmount'); }, update: function (props: QiankunProps): void | Promise<void> { console.log('update'); } });