# 导出应用
本章将介绍如何使用 `createBridgeComponent` 将您的 React 应用导出为可被远程加载的模块。
## 安装
```sh [npm]
npm install @module-federation/bridge-react@latest
```
```sh [yarn]
yarn add @module-federation/bridge-react@latest
```
```sh [pnpm]
pnpm add @module-federation/bridge-react@latest
```
## 基本使用
### 步骤 1: 创建导出入口
要导出一个 React 应用,您需要创建一个专门的导出文件,使用 `createBridgeComponent` 将应用包装为远程模块。
假设您的应用入口是 `App.tsx`,创建一个新文件 `export-app.tsx`:
```tsx
// ./src/export-app.tsx
import App from './App';
import { createBridgeComponent } from '@module-federation/bridge-react';
// 使用 createBridgeComponent 将 App 包装为远程模块并导出
export default createBridgeComponent({
rootComponent: App
});
```
### 步骤 2: 配置 `exposes` 导出
接下来需要在构建工具中配置 Module Federation,将创建的导出文件暴露给其他应用使用。
:::tip 构建工具支持
以下示例使用 Rsbuild 配置,请根据您使用的构建工具进行相应调整:
- **Rsbuild**: `@module-federation/rsbuild-plugin`
- **Rspack**: `@module-federation/enhanced/rspack`
- **Webpack**: `@module-federation/enhanced/webpack`
- **Vite**: `@module-federation/vite`
:::
```ts
// rsbuild.config.ts
import { pluginModuleFederation } from '@module-federation/rsbuild-plugin';
export default {
plugins: [
pluginModuleFederation({
name: 'remote1',
exposes: {
'./export-app': './src/export-app.tsx', // 导出应用类型远程模块
},
}),
],
};
```
## Bridge Router 配置
React Bridge 提供了强大的路由协同能力,可根据当前路径动态为应用注入 basename 和路由上下文传递。
:::info 路由框架支持
- Bridge Router 目前支持 React Router v5、v6、v7 版本的路由代理功能。
- 暂不支持其他路由框架如 `@tanstack/react-router`,针对非 React Router 的应用,需要显示关闭 `enableBridgeRouter`,并自行处理路由逻辑。
:::
### 启用 Bridge Router
```ts
// rsbuild.config.ts
import { pluginModuleFederation } from '@module-federation/rsbuild-plugin';
export default {
plugins: [
pluginModuleFederation({
name: 'remote1',
exposes: {
'./export-app': './src/export-app.tsx',
},
bridge: {
// 启用 Bridge Router 路由能力,默认为 true
enableBridgeRouter: true,
}
}),
],
};
```
### 配置说明
- **`enableBridgeRouter: true`** (默认值) - 自动处理 basename 和路由协同,支持 React Router v5、v6、v7
- **`enableBridgeRouter: false`** - 禁用 Bridge 默认的路由代理能力,用户需手动处理路由集成
:::warning 重要
启用 Bridge Router 时,请勿将 `react-router-dom` 配置为 shared 依赖,否则会导致路由功能异常。
:::
## createBridgeComponent API 参考
### 函数签名
```tsx
function createBridgeComponent<T = any>(
bridgeInfo: Omit<ProviderFnParams<T>, 'createRoot'>
): () => {
render(info: RenderParams): Promise<void>;
destroy(info: DestroyParams): void;
}
```
### ProviderFnParams\<T>
桥接组件的配置参数:
```tsx
interface ProviderFnParams<T> {
// 根组件
rootComponent: React.ComponentType<T>;
// 自定义渲染函数(可选)
render?: (App: React.ReactElement, id?: HTMLElement | string) => RootType | Promise<RootType>;
// 自定义 createRoot 函数(可选,React 18+)
createRoot?: (container: Element | DocumentFragment, options?: CreateRootOptions) => Root;
// 默认的 createRoot 选项(React 18+)
defaultRootOptions?: CreateRootOptions;
}
```
### RenderParams
渲染参数接口:
```tsx
interface RenderParams {
moduleName?: string;
basename?: string;
memoryRoute?: {
entryPath: string;
initialState?: Record<string, unknown>;
};
dom: HTMLElement; // 渲染目标 DOM 元素
rootOptions?: CreateRootOptions; // React 18+ 的 createRoot 选项
[key: string]: unknown; // 其他自定义属性
}
```
### DestroyParams
销毁参数接口:
```tsx
interface DestroyParams {
moduleName: string;
dom: HTMLElement;
}
```
### CreateRootOptions
React 18+ 的 createRoot 选项:
```tsx
interface CreateRootOptions {
identifierPrefix?: string; // 标识符前缀
onRecoverableError?: (error: unknown) => void; // 可恢复错误处理
transitionCallbacks?: unknown; // 过渡回调
}
```
### 高级用法示例
#### 自定义渲染逻辑
```tsx
// ./src/export-app.tsx
import App from './App';
import { createBridgeComponent } from '@module-federation/bridge-react';
import { createRoot } from 'react-dom/client';
export default createBridgeComponent({
rootComponent: App,
// 自定义渲染函数
render: (App, container) => {
const root = createRoot(container as HTMLElement, {
identifierPrefix: 'my-app-'
});
root.render(App);
return root;
},
// 默认的 createRoot 选项
defaultRootOptions: {
identifierPrefix: 'remote-app-',
onRecoverableError: (error) => {
console.error('Remote app recoverable error:', error);
}
}
});
```
#### 支持多个导出
```tsx
// ./src/export-app.tsx
import App from './App';
import Dashboard from './Dashboard';
import { createBridgeComponent } from '@module-federation/bridge-react';
// 导出主应用
export default createBridgeComponent({
rootComponent: App
});
// 导出仪表板组件
export const dashboard = createBridgeComponent({
rootComponent: Dashboard
});
```
对应的 Module Federation 配置:
```ts
// rsbuild.config.ts
export default {
plugins: [
pluginModuleFederation({
name: 'remote1',
exposes: {
'./export-app': './src/export-app.tsx', // 主应用
'./dashboard': './src/export-app.tsx', // 仪表板
},
}),
],
};
```
## 下一步
导出应用配置完成后,您可以继续阅读 [加载远程应用](/zh/practice/bridge/react-bridge/load-app.md) 来了解如何在宿主应用中加载这个远程应用。