从乾坤到无界:一份可落地的微前端 Demo 笔记
从乾坤到无界:一份可落地的微前端 Demo 笔记
—— 含双框架对比、踩坑记录与源码仓库
微前端入门速览
- 为什么需要微前端
当巨石应用膨胀到“编译 5 min、上线 3 h、回滚 1 h”时,就把“技术栈升级”“独立部署”“灰度发布”变成了奢望。微前端把单体拆成多个可独立开发、测试、部署的子应用,再在一个外壳(主应用)里动态拼装,兼顾了“体验一体化”与“团队自治”。 - 核心诉求
技术栈无关|独立部署|运行时隔离|存量平滑迁移|性能可接受
一句话:让“多团队 + 多技术栈 + 频繁发版”不再互相伤害。 - 主流实现路线
① 路由分发:nginx 或主应用按路由转发到不同站点(最早、最简单,但体验割裂)。
② iframe 彻底隔离:DOM/CSS/JS 天然沙箱,但“弹窗全屏、前进后退、SEO、性能”全是坑。
③ JS Entry / 快照:single-spa、乾坤、无界等,把子应用打成 JS Bundle,运行时动态挂载/卸载,兼顾体验与隔离。
④ Web Component + Module Federation:更原生、更底层,但浏览器支持度和改造成本需评估。 - 乾坤(qiankun)速描
- 阿里开源,single-spa 的“国内增强版”。
- 基于 JS Entry + HTML Entry 双模式,支持 webpack、vite、umi。
- 提供样式隔离(experimentalStyleIsolation)、JS 沙箱(ProxySandbox/LegacySandbox)、全局变量 diff、预加载、资源缓存、全局错误捕获。
- 社区庞大,中文文档友好,但“样式隔离不彻底”“vite 接入需插件”“IE11 下沙箱性能”仍常被吐槽。
- 无界(wujie)速描
- 腾讯开源,Web Components + iframe 的“混血”方案。
- 子应用跑在 iframe 里,DOM 通过 Web Component 插回主应用,既利用 iframe 的绝对隔离,又解决“弹窗/全屏/路由同步”顽疾。
- 支持 vite、webpack、angular、react、vue 几乎零改造;子应用可“热插拔”而不刷新整页。
- 代价:内存占用略高、初次加载多一次 iframe 创建、IE 直接放弃。
- 双框架 30 秒对比
隔离强度:无界 > 乾坤
接入改造成本:无界 < 乾坤
社区/文档:乾坤 >> 无界
首屏性能:乾坤略优(无 iframe 开销)
多实例共存:无界天然支持,乾坤需手动防冲突
浏览器下限:乾坤可降 IE11,无界需 Modern Chrome/Edge - 落地小贴士
- 先画“子应用拆分图”:按业务域 > 团队边界 > 页面维度逐级拆,别一上来就拆组件。
- 统一“基座协议”:路由前缀、全局状态、错误码、登录态、灰度 KEY。
- 把“构建、部署、监控、回滚”做成模板,让业务团队只关心自己目录。
- 给子应用留“逃生窗口”:万一框架出故障,nginx 转发回独立域名仍可跑。
- 性能预算:子应用首屏 < 200 KB(gzip),基座 < 100 KB, prefetch 用 IntersectionObserver 懒触发。
- 监控:子应用白屏、JS Error、资源 404、卸载残留都要上报,否则“互相甩锅”无尽头。
qiankun-demo
使用qiankun实现微前端
qiankun文档:https://qiankun.umijs.org/zh
主应用
安装依赖
1 | npm i qiankun -S |
子应用配置
在main.ts中加上子应用相关的配置
1 | registerMicroApps([ |
子应用
安装依赖
1 | npm i vite-plugin-qiankun -D |
改造main.ts
1 | import "./assets/main.css"; |
改造vite.config.ts
1 | import { fileURLToPath, URL } from "node:url"; |
注意点
子应用的样式会影响主应用
我的主应用开启了样式隔离,但是没啥效果,不确定是就是这种设定,或者我写的有问题,又或是vue3+vite版本不支持
所有全局样式尽量保持一致,使用的UI组件库版本尽量也保持一致
主应用开启样式隔离代码:
1
2
3
4
5
6start({
sandbox: {
strictStyleIsolation: false,
experimentalStyleIsolation: true,
},
});
无界微前端
无界微前端示例代码 lord-app(主应用)、sub-app(子应用)
官网文档:https://wujie-micro.github.io/doc/
主应用
安装依赖
1 | npm i wujie-vue3 -S |
在主应用中注册无界
1 | import WujieVue from "wujie-vue3"; |
在组件中使用 WujieVue
views/SubApp.vue
1 | <template> |
需要在路由中增加一个
1 | { |
子应用
子应用需要改造一点内容
改造main.ts
需要根据__POWERED_BY_WUJIE__判断环境,抽离出了渲染执行的函数
1 | import "./assets/main.css"; |
改造路由
需要给路由加上前缀
1 | import { createRouter, createWebHistory } from "vue-router"; |
改造vite.config.ts
本地调试需要开启cors或者headers请求头Access-Control-Allow-Origin改成*
后续发布到正式服务器还是得设置这种
1 | server: { |
注意点
关闭浏览器的
Vue.js devtools如果没有关闭会出现报错,Vue DevTools 在多应用环境下重复定义全局钩子
1
2
3
4Uncaught TypeError: Cannot redefine property: __VUE_DEVTOOLS_GLOBAL_HOOK__
at Object.defineProperty (<anonymous>)
at detectIframeApp (<anonymous>:33:10)
at <anonymous>:69:3
