当前位置: 首页 > ds >正文

使用 qiankun 实现 Vue3 与 Avalon 混合应用集成实践

🚀 使用 qiankun 实现 Vue3 与 Avalon 混合应用集成实践

在前端技术演进的过程中,老旧项目的技术栈不可避免地与新技术并存。比如我司的主应用基于多年历史的 avalon.js,但新功能和新页面已经全面采用 Vue3 重构。

为了实现平滑升级、分阶段迁移,同时保证新旧系统互不影响,我们选用了微前端框架 qiankun 来实现 Vue3Avalon 的无缝集成。

本文将详解如何基于 qiankun 集成 Vue3Avalon,支持新旧页面自由切换,并为后续逐步迁移留出扩展空间。


📖 技术栈说明

  • avalon.js:老牌 MVVM 框架,基于数据双向绑定的前端方案,类似于早期 Vue2。
  • Vue3:当前主流现代化前端框架,Composition API、响应式系统优化。
  • qiankun:基于 single-spa 的微前端实现库,支持主应用注册多个子应用,解耦部署、独立运行。

📐 项目架构概览

root/
├── main-app/ # 主应用(avalon项目 + qiankun)
├── sub-vue3/ # 子应用(vue3 项目)
├── sub-xxx/ # 其他未来可能的子应用


🎯 需求目标

  • 保留原有 avalon 页面
  • 新页面统一以 vue3 模块形式开发
  • 支持页面切换新版/旧版
  • 模块解耦,独立开发、独立部署
  • 方便未来逐步迁移至 vue3

🔧 实战步骤

1️⃣ 主应用(avalon + qiankun)

安装 qiankun
npm install qiankun --save
配置 qiankun
// main-app/src/micro-app.js
import { registerMicroApps, start } from 'qiankun';// 注册子应用
registerMicroApps([{name: 'sub-vue3',                    // 子应用名称entry: '//localhost:7100',           // 子应用访问地址container: '#subapp-viewport',       // 子应用挂载容器activeRule: '/vue3'                  // 激活规则}
]);// 启动 qiankun
start();
页面布局(index.html)
<body><div id="avalon-app"><!-- avalon 内容 --></div><div id="subapp-viewport"></div>
</body>

avalon 页面和子应用容器并存。

2️⃣ 子应用(vue3 项目)

配置 vite/vue-cli(以 vite 为例)
// vite.config.js
export default defineConfig({base: '/',server: {port: 7100,cors: true},build: {outDir: 'dist'}
});
子应用 qiankun 适配
// sub-vue3/src/main.js
import { createApp } from 'vue';
import App from './App.vue';let app = null;function render(props = {}) {const { container } = props;app = createApp(App);app.mount(container ? container.querySelector('#app') : '#app');
}// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {render();
}// qiankun 生命周期钩子
export async function bootstrap() {console.log('vue3 子应用 bootstrap');
}
export async function mount(props) {console.log('vue3 子应用 mount');render(props);
}
export async function unmount() {console.log('vue3 子应用 unmount');if (app) {app.unmount();app = null;}
}
子应用入口 html
<div id="app"></div>

🔄 页面切换实现

我们为主应用提供一个新版/旧版切换按钮:
<button onclick="goToNew()">新版</button>
<button onclick="goToOld()">旧版</button>
function goToNew() {location.hash = '/vue3';
}function goToOld() {location.href = '/#/oldpage';
}

/vue3 路由规则命中 qiankun 激活规则,渲染 Vue3 子应用。其余路由交由 avalon 处理。

⚙️ 兼容 avalon 的注意点

  • 子应用需避免污染全局 window 变量,防止与 avalon 冲突。
  • 子应用 CSS 建议开启 CSS scope 或 CSS modules,避免样式互相覆盖。
  • 子应用和主应用资源路径独立,vite 项目 base 设为 ‘/’,确保子应用路径相对。

📊 未来扩展方案

  • 后续新增子应用直接注册:
registerMicroApps([{ name: 'sub-vue3', entry: '//localhost:7100', container: '#subapp-viewport', activeRule: '/vue3' },{ name: 'sub-admin', entry: '//localhost:7200', container: '#subapp-viewport', activeRule: '/admin' }
]);
  • avalon 页面逐步迁移,替换旧路由指向对应子应用。
  • 新功能优先使用 vue3 子应用开发。
http://www.xdnf.cn/news/9193.html

相关文章:

  • 一些git的常见操作记录
  • C50-指针数组
  • [灵龙AI API] AI生成视频API:文生视频 – 第2篇
  • 嵌入式开发新范式:NTP时间同步实验与高精度仿真平台实践
  • OpenGAN:基于开放数据生成的开放集识别
  • 一周学会Pandas2之Python数据处理与分析-Pandas2数据合并与对比-df.combine():元素级合并
  • 统一人体姿态估计与分割的新方法:KDC
  • C# Windows Forms应用程序-003
  • day 37
  • IP协议解析
  • 使用json传递信息时接收不到的问题
  • python做题日记(9)
  • 【AI News | 20250526】每日AI进展
  • AI时代新词-私有数据与AI结合的技术:隐私保护与数据利用的平衡
  • pg库分表操作步骤- PostgreSQL 分区表
  • 车载通信网络 --- 传统车载网络及其发展
  • 固态硬盘的寿命与可靠性如何保障?——以Kingston FURY Renegade G5为例的专业解析
  • 自动编码器 潜在空间 Autoencoders 视频截图
  • 浏览器指纹科普 | 语言 vs 界面语言,区别是什么?
  • GitLab-CI快速开始
  • gin使用Mysql连接池用法
  • IDEA没有出现TODO
  • 实在Agent成业界首批全面适配鸿蒙、麒麟、统信信创系统的智能体
  • git clone 提速
  • redis在Spring中的一些使用
  • 用llama3微调了一个WiFiGPT 用于室内定位
  • Linux文本搜索——grep命令详解
  • PostGIS实现二进制转栅格数据应用实践【ST_RastFromWKB】
  • Web安全渗透之长城杯夺旗赛
  • 工作计划工作总结年终总结PPT模版分享