拓冰建站拓冰建站
首页 / 资讯中心 / 正文

vue-vben-admin 集成 qiankun 微前端:10 分钟落地与避坑指南

vue-vben-admin 集成 qiankun 微前端10 分钟落地与避坑指南【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin这篇带你把 vue-vben-admin 拆成可独立部署的微应用qiankun 微前端集成 10 分钟搞定主应用注册、生命周期导出、跨域与挂载验证四步走完就能跑通。 先判断值不值得拆微前端拆不拆先看三个信号不满足就别硬拆。团队是否隔离多个业务小组要各自发布、互不阻塞才值得拆一个人维护的项目拆了只会多一套部署成本。技术栈是否异构某个模块要用 React 或老 Vue2vben 主框架吃不下这时用 qiankun 把它当黑盒挂进来最省事。发布频率是否独立某模块要每天发版而主应用两周发一次路由前缀隔离能避免互相牵连。三条里至少占两条再往下走。否则保持单体维护成本更低。 动手前看清楚目录与前置条件vue-vben-admin 是 pnpm monorepo先分清两个目录的角色后面改哪里心里有数。apps/可独立运行的前端应用如 web-antd、web-ele、web-naive每个都能单独dev/build天然适合当微应用。packages/共享代码布局、请求、样式等不直接部署改它等于改所有应用谨慎。playground/演示环境功能最全适合拿来当主应用试错。前置要求见根 package.json项要求Node^22.18.0 或 ^24.12.0pnpm 11.0.0preinstall强制只用 pnpm主应用从apps/或playground里挑一个本文以 web-antd 为例微应用至少一个独立apps/*应用端口不冲突 集成四步走第 1 步在主应用安装 qiankun目的让主应用具备注册与调度微应用的能力。操作仓库只读实际操作在你本地 fork 上进行在选定的主应用目录执行以 web-antd 为例# 只往主应用里装不要装到 packages 共享层 pnpm -F vben/web-antd add qiankun验证cat apps/web-antd/node_modules/qiankun/package.json能看到版本号且主应用pnpm dev不报错。第 2 步注册微应用并启动目的告诉 qiankun 有哪些微应用、各自挂在哪个路由前缀下。操作在主应用入口apps/web-antd/src/main.ts里于initApplication()调用之前注册。主应用像门禁加调度台微应用是各层租户activeRule就是每层的门牌号import { registerMicroApps, start } from qiankun; registerMicroApps([ { name: web-ele, // 与微应用 name 一致 entry: http://localhost:5557, // 微应用 dev 服务地址 container: #subapp-container, // 主应用里留一个挂载容器 activeRule: /web-ele, // 路由前缀访问即激活 props: { token: demo-token }, // 透传给微应用 }, ]); start({ sandbox: { experimentalStyleIsolation: true } }); // 样式隔离见踩坑清单验证主应用页面里能看到#subapp-container节点控制台无 qiankun 报错。第 3 步导出微应用生命周期目的让微应用既能在自己浏览器里跑也能被主应用挂载、卸载。操作vben 的挂载逻辑在apps/web-antd/src/bootstrap.ts的bootstrap()最后app.mount(#app)。改成把挂载容器参数化并在入口导出三个钩子// 把 bootstrap 的 mount 目标改由 props 决定 let app: ReturnTypetypeof createApp | null null; export async function mount(props: { container?: Element }) { const el (props.container as HTMLElement)?.querySelector(#app); const root el ?? document.querySelector(#app); app createApp(App); // 复用现有初始化i18n、store、router await setup(app, root); app.mount(root); } export async function unmount() { app?.unmount(); app null; } // 独立运行没有被 qiankun 接管时才自启动 if (!window.__POWERED_BY_QIANKUN__) { bootstrap(import.meta.env.VITE_APP_NAMESPACE); }验证pnpm -F vben/web-ele dev直接访问http://localhost:5557页面正常渲染说明独立模式没被破坏。第 4 步调整 Vite 开发/构建配置目的解决跨域与端口让主应用能拉到微应用的入口资源。操作vben 的 vite.config.ts 用vben/vite-config的defineConfig自定义项塞进vite字段。给微应用开端口和 CORS 头// apps/web-ele/vite.config.ts import { defineConfig } from vben/vite-config; export default defineConfig(async () ({ vite: { server: { port: 5557, // 与主应用注册时的 entry 端口一致 cors: true, // 允许主应用跨域拉取资源 }, build: { // 生产用 UMD 产物被 qiankun import 时库名需与注册 name 对应 lib: { name: webEle, formats: [umd] }, }, }, }));验证访问主应用http://localhost:5556/web-ele主应用默认 5556看到微应用界面出现即挂载成功切回其它前缀微应用消失且无残留 DOM即卸载成功。⚠️ 踩坑清单通信、样式、路由、跨域四类问题合并成一张表对号入座现象原因解法微应用白屏控制台CORS报错跨域被浏览器拦微应用server.cors: true生产由 Nginx 补Access-Control-Allow-Origin两个应用样式互相污染全局 CSS 串味用experimentalStyleIsolation影子 DOMstrictStyleIsolation会破坏弹窗定位慎用切路由时微应用不卸载activeRule前缀重叠给每个微应用唯一前缀如/web-ele、/web-antd主应用路由不要再用同一路径主应用拿不到微应用数据只靠全局变量刷新即丢注册时用props透传token、userInfo微应用在mount(props)里写进 store微应用独立跑正常挂进去挂不上生命周期没导出或#app找不到确认bootstrap.ts导出了mount/unmount且props.container内存在#app节点两点补充状态别散落在各应用全局变量里统一走props下发 store 落地通信路径才稳定。路由前缀在「主应用注册」和「微应用 base」两处都要对齐改一处漏一处是最常见的挂不上原因。✅ 验收清单全部满足才算集成完成微应用单独pnpm dev访问页面正常独立运行主应用访问activeRule前缀微应用出现挂载正常切走路由后容器清空无残留 DOM卸载干净控制台无 CORS、无 qiankun 报错跨域通过主应用props里的 token 能在微应用 store 中读到通信打通【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门