加载应用
本章将介绍如何使用 createRemoteAppComponent 在宿主应用中加载和集成远程 React 应用。
什么是 createRemoteAppComponent?
createRemoteAppComponent 是 React Bridge 的核心 API,用于在宿主应用中加载远程 React 应用。它具有以下特性:
- 🚀 自动懒加载 - 远程应用会在需要时才开始加载
- 🔧 生命周期管理 - 自动处理组件的挂载和卸载
- 🛣️ 路由集成 - 无缝集成 React Router,支持 basename 注入
- ⚡ 错误处理 - 内置加载失败和运行时错误处理机制
- 🎨 样式隔离 - 支持组件级样式和类名配置
安装
基本使用
步骤 1: 配置远程模块
在宿主应用的配置文件中,添加远程应用的配置:
构建工具支持
以下示例使用 Rsbuild 配置,请根据您使用的构建工具进行相应调整:
- Rsbuild:
@module-federation/rsbuild-plugin - Rspack:
@module-federation/enhanced/rspack - Webpack:
@module-federation/enhanced/webpack - Vite:
@module-federation/vite
步骤 2: 创建远程组件
2.1 定义加载和错误组件
首先,创建加载状态和错误处理组件:
2.2 创建远程应用组件
使用 createRemoteAppComponent 创建远程组件:
2.3 主应用路由配置
在主应用中配置路由:
远程组件 Props
路由相关属性
basename: 设置远程应用的基础路径memoryRoute: 内存路由配置,用于将子应用路由作为 memoryRouter 控制
样式属性
style: React.CSSProperties - 设置组件样式className: string - 设置组件类名
引用支持
ref: React.Ref<HTMLDivElement> - 转发引用到内部容器元素,可用于 DOM 操作
数据传递
props: 传递给远程组件的属性对象- 或者直接传递属性,如
userId={'123'}
createRemoteAppComponent API 参考
函数签名
RemoteComponentParams<T, E>
配置参数接口:
RemoteComponentProps<T>
返回组件的属性接口:
参数详解
loader
- 类型:
() => Promise<T> - 必需: 是
- 作用: 用于加载远程模块的函数,返回一个 Promise,该 Promise 解析为远程模块对象
- 示例:
loading
- 类型:
React.ReactNode - 必需: 是
- 作用: 在远程应用加载期间显示的加载内容,可以是组件、元素或字符串
- 示例:
fallback
- 类型:
React.ComponentType<{ error: Error }> - 必需: 是
- 作用: 当远程应用加载失败时显示的错误回退组件,会接收错误对象作为
error属性 - 示例:
export
-
类型:
E extends keyof T(泛型约束,通常是string) -
必需: 否
-
默认值:
'default' -
作用: 指定要使用的远程模块导出名称
-
示例:
假设远程模块有以下导出:
在宿主应用中可以这样使用:
Bundle 体积优化
React Router 依赖说明
默认情况下,@module-federation/bridge-react 会将 react-router-dom 打包到你的 bundle 中,这是为了提供以下开箱即用的能力:
- ✅ 自动 basename 注入 - 无需手动配置路由基础路径
- ✅ 路由上下文传递 - 自动处理 React Router 上下文
- ✅ 嵌套路由支持 - 完整的路由集成能力
但是,如果你的项目满足以下任一条件:
- 不需要路由功能(纯组件加载)
- 使用非 react-router 的路由框架(如 TanStack Router)
- 希望最小化 bundle 体积
建议关闭 enableBridgeRouter 配置来禁用此能力,这将:
- ✅ 减小 bundle 体积约 3KB (gzipped)
- ✅ 避免不必要的依赖注入
- ✅ 消除潜在的版本冲突风险
如何禁用 Router 依赖
你可以通过 bridge.enableBridgeRouter 配置来控制是否包含路由支持:
rsbuild.config.ts
配置行为
enableBridgeRouter: false: 自动 alias 到/base入口(不包含 react-router-dom 代码)enableBridgeRouter: true或undefined: 包含路由支持(默认行为)
何时禁用 Router?
禁用 router (enableBridgeRouter: false) 适用于:
- ✅ 应用不使用 react-router
- ✅ 想要最小化 bundle 体积
- ✅ 可以手动管理 basename(如果需要)
保持 router 启用(默认)适用于:
- ✅ 应用使用 react-router
- ✅ 需要自动 basename 注入
- ✅ 需要路由上下文集成
迁移示例
迁移前:启用 Router(默认)
迁移后:禁用 Router(优化)
rsbuild.config.ts
工作原理
当设置 enableBridgeRouter: false 时,Module Federation 插件会自动设置 webpack alias:
这意味着你的导入会自动解析到无路由版本,无需修改任何代码!