基于qiankun的以Vue3为基座的微程序实现
前言
基座:基于vite的vue3.2 (base-app)
子程序:基于vite的vue3.2 (micro-app-vue)、基于webpack的Angular (micro-app-angular)、基于webpack的React (micro-app-react)
一、基于vite的vue3.2基座配置(base-app)
1. 安装路由和配置路由,和往常一样,过程略
2. App.vue
<template> <div style="text-align: center"> <router-link to="/"><h1>这里是主应用</h1></router-link> <br /> <router-link to="/vue">显示Vue微应用</router-link> <br /> <router-link to="/angular">显示Angular微应用</router-link> <br /> <router-link to="/react">显示React微应用</router-link> <hr /> <!-- 准备好子应用待渲染的容器 --> <div id="microAppContainer"></div> </div> </template> <script setup lang="ts"></script> <style scoped></style>
3. 安装qiankun
npm i qiankun -S
4. 新建registerApps.ts文件后在main.ts引入,或直接在main.ts写入如下内容,以下为新建
- registerApps.ts
// 注册微应用文件 import { registerMicroApps, start } from 'qiankun'; // 注册多个微应用 registerMicroApps( [ { name: 'micro-app-vue', entry: '//localhost:8001', container: '#microAppContainer', // App.vue配置的节点 activeRule: '/vue', props: {} // 用于传参 }, { name: 'micro-app-angular', entry: '//localhost:4200', container: '#microAppContainer', // App.vue配置的节点 activeRule: '/angular', props: {} // 用于传参 }, { name: 'micro-app-react', entry: '//localhost:6000', container: '#microAppContainer', // App.vue配置的节点 activeRule: '/react', props: {} // 用于传参 }, ], { beforeLoad: async (app) => { console.log('beforeLoad...', app.name); }, beforeMount: async (app) => { console.log('beforeMount...', app.name); }, afterMount: async (app) => { console.log('afterMount...', app.name); }, afterUnmount: async (app) => { console.log('afterUnmount...', app.name); } } ); // 启动 qiankun // start({ // prefetch: 'all', // 预加载 // sandbox: { // strictStyleIsolation: true, // 开启严格的样式隔离模式 // experimentalStyleIsolation: true // } // }); start();
- main.ts
import { createApp } from 'vue'; import './style.css'; import App from './App.vue'; import router from './router/router'; // 在main.ts引入registerMicroApp.ts import './registerApps'; createApp(App).use(router).mount('#app');
二、基于vite的vue3.2子程序配置(micro-app-vue)
1. 安装路由和配置路由,和往常一样,过程略
2. 安装vite-plugin-qiankun插件
npm i vite-plugin-qiankun -S
3. 配置vite.config.ts
import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import qiankun from 'vite-plugin-qiankun'; // https://vitejs.dev/config/ export default defineConfig({ base: '/vue', plugins: [vue(), qiankun('micro-app-baseVue', { useDevMode: true })], server: { host: '0.0.0.0', port: 8001, // 2000端口 open: false, cors: true, origin: 'http://localhost:8001' } });
4. 配置main.ts
import { createApp } from 'vue'; import './style.css'; import App from './App.vue'; import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'; import router from './router/router'; let app: any; // 没有乾坤时,即独立运行 if (!qiankunWindow.__POWERED_BY_QIANKUN__) { // render(); createApp(App).use(router).mount('#app'); } else { renderWithQiankun({ mount(props) { app = createApp(App); app.mount(props.container?.querySelector('#app')); }, bootstrap() { console.log('bootstrap'); }, update() { console.log('update'); }, unmount() { console.log('unmount'); app?.unmount(); } }); }
三、Angular子程序配置(micro-app-angular)
版本:angular14
插件:single-spa-angular@7
步骤:
1. 创建子应用
ng new micro-app-angular --routing --prefix micro-app-angular
cd micro-app-angular
2. 安装single-spa-angular
ng add single-spa-angular --project micro-app-angular
3.在main.single-spa.ts文件中做修改
将环境相关的配置注释
4.在app-routing.module.ts文件中
+ import { APP_BASE_HREF } from '@angular/common'; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule], // @ts-ignore + providers: [{ provide: APP_BASE_HREF, useValue: window.__POWERED_BY_QIANKUN__ ? '/angular' : '/' }] })
此处的/angular要与主应用配置一致
5.需要给子应用加唯一标识(多个angular子应用时)
如果不加会出现container即主应用中微应用容器container找不到的问题
在main.single-spa.ts中
template: '<app-root id="child_one"/>',
完整代码展示
const lifecycles = singleSpaAngular({ bootstrapFunction: singleSpaProps => { singleSpaPropsSubject.next(singleSpaProps); return platformBrowserDynamic(getSingleSpaExtraProviders()).bootstrapModule(AppModule); }, template: '<app-root id="child_one"/>', Router, NavigationStart, NgZone, });
在app.component.ts中
selector: '#child_one app-root',
完整代码展示
@Component({ selector: '#child_one app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] })
6.为了能让子应用单独运行还要添加一下内容
如果不写 子应用不能单独运行,但可以在主应用中运行
在main.single-spa.ts中
import 'zone.js/dist/zone'; // 微应用单独启动时运行 if (!(window as any).__POWERED_BY_QIANKUN__) { platformBrowserDynamic() .bootstrapModule(AppModule) .catch((err) => console.error(err)); }
7. 以下未确定是不是必须:
注释 polyfills.ts 中 import 'zone.js';
在主应用中安装zone.js
npm i zone.js
在主应用main.ts引入qiankun前,引入zone.js
import 'zone.js';
搞定!!!!
本文来自博客园,作者:RHCHIK,转载请注明原文链接:https://www.cnblogs.com/suihung/p/17054935.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)