graph TB
A[主应用 / 基座 Container] --> B[子应用 A<br/>React App]
A --> C[子应用 B<br/>Vue App]
A --> D[子应用 C<br/>Angular App]
A --> E[路由分发]
A --> F[应用注册]
A --> G[生命周期管理]
A --> H[应用间通信]
subgraph "独立开发 & 部署"
B
C
D
end
style A fill:#2c3e50,color:#fff
style B fill:#61dafb,color:#000
style C fill:#42b883,color:#fff
style D fill:#dd1b16,color:#fff
// sub-app webpack config — important for qiankun // vue.config.js or webpack.config.js module.exports = { output: { library: 'dashboard', // Must match name in registerMicroApps libraryTarget: 'umd', chunkLoadingGlobal: `webpackJsonp_dashboard`, }, devServer: { headers: { 'Access-Control-Allow-Origin': '*', // Required for cross-origin loading }, }, };
方案四:Module Federation
(Webpack 5)
Module Federation
允许在运行时动态加载远程模块,实现组件级别的微前端:
graph TB
A[Host App<br/>webpack.config.js] -->|动态导入| B[Remote App A<br/>exposes: ./Button]
A -->|动态导入| C[Remote App B<br/>exposes: ./Chart]
subgraph "Shared Dependencies"
D[react]
E[react-dom]
end
B --> D
C --> D
A --> D
style A fill:#8dd6f9,color:#000
style B fill:#f5a623,color:#000
style C fill:#7ed321,color:#000
style D fill:#e74c3c,color:#fff
graph TB
A[应用间通信] --> B[Props 传递]
A --> C[Custom Events]
A --> D[共享状态]
A --> E[URL 参数]
B --> B1[主应用 → 子应用<br/>mount props]
C --> C1[CustomEvent API<br/>松耦合通信]
D --> D1[共享 Store<br/>Redux/Zustand]
E --> E1[路由参数<br/>Query String]
style A fill:#2c3e50,color:#fff
style C fill:#e74c3c,color:#fff
style D fill:#3498db,color:#fff
// In any micro-app import { userStore } from'shared_store/userStore'; import { useStore } from'zustand';
functionUserInfo() { const user = useStore(userStore, (state) => state.user); return user ? <span>{user.name}</span> : <span>未登录</span>; }
方案对比总结
特性
iframe
Web Components
qiankun
Module Federation
隔离性
最强
较强 (Shadow DOM)
中等 (JS 沙箱)
弱
性能
差
中
中
好
接入成本
低
中
中
高
通信便捷性
差
中
好
好
技术栈无关
是
是
是
受限 (Webpack)
共享依赖
不能
不能
有限
完善
独立部署
是
是
是
是
粒度
页面级
组件级
页面级
组件级
选型建议
flowchart TD
A[微前端需求] --> B{需要组件级共享?}
B -->|是| C{使用 Webpack?}
C -->|是| D[Module Federation]
C -->|否 / Vite| E[Vite Federation Plugin]
B -->|否, 页面级| F{需要强隔离?}
F -->|是| G{接受 iframe 缺陷?}
G -->|是| H[iframe]
G -->|否| I[qiankun + strictStyleIsolation]
F -->|否| J[qiankun / single-spa]
style D fill:#8dd6f9,color:#000
style H fill:#95a5a6,color:#fff
style I fill:#e74c3c,color:#fff
style J fill:#e74c3c,color:#fff