logologo
Guide
Practice
Configuration
Plugins
Showcase
Blog
Ecosystem
Module Federation Examples
Practical Module Federation
Zephyr Cloud
Nx
简体中文
English
Guide
Practice
Configuration
Plugins
Showcase
Blog
Module Federation Examples
Practical Module Federation
Zephyr Cloud
Nx
简体中文
English
logologo
Overview

Bridge

Bridge Overview

React Bridge

Getting Started
Export Application
Load Remote Application
Load Remote Component
Vue Bridge

Frameworks

Framework Overview

React

Basic CRA with Rsbuild
Using Nx CLI for React
Internationalization (i18n)

Modern.js

Quick Start
Dynamic load provider

Next.js

Basic Example
Importing Components
Routing & Importing Pages
Working with Express.js
Presets

Angular

Angular CLI Setup
Using Nx CLI for Angular
Micro-frontends with Angular
Server-Side Rendering
Using Service Workers
Authentication with Auth0
Authentication with Okta
Splitting a Monolith
Extending a Monolith
Edit this page on GitHub
Previous PageGetting Started
Next PageLoad Remote Application

#Export Applications

This chapter will introduce how to use createBridgeComponent to export your React application as a module that can be loaded remotely.

#Installation

npm
yarn
pnpm
npm install @module-federation/bridge-react@latest

#Basic Usage

#Step 1: Create Export Entry

To export a React application, you need to create a dedicated export file and use createBridgeComponent to wrap the application as a remote module.

Assuming your application entry is App.tsx, create a new file export-app.tsx:

// ./src/export-app.tsx
import App from './App';
import { createBridgeComponent } from '@module-federation/bridge-react';

// Use createBridgeComponent to wrap App as a remote module and export
export default createBridgeComponent({
  rootComponent: App
});

#Step 2: Configure exposes Export

Next, you need to configure Module Federation in your build tool to expose the created export file for use by other applications.

Build Tool Support

The following example uses Rsbuild configuration. Please adjust according to your build tool:

  • Rsbuild: @module-federation/rsbuild-plugin
  • Rspack: @module-federation/enhanced/rspack
  • Webpack: @module-federation/enhanced/webpack
  • Vite: @module-federation/vite
// rsbuild.config.ts
import { pluginModuleFederation } from '@module-federation/rsbuild-plugin';

export default {
  plugins: [
    pluginModuleFederation({
      name: 'remote1',
      exposes: {
        './export-app': './src/export-app.tsx', // Export application-type remote module
      },
    }),
  ],
};

#Bridge Router Configuration

React Bridge provides powerful routing coordination capabilities that can dynamically inject basename and route context passing based on the current path.

Router Framework Support
  • Bridge Router currently supports routing proxy functionality for React Router v5, v6, and v7 versions.

  • It does not support other routing frameworks such as @tanstack/react-router. For applications using non-React Router frameworks, you need to explicitly disable enableBridgeRouter and handle routing logic yourself.

#Enable Bridge Router

// rsbuild.config.ts
import { pluginModuleFederation } from '@module-federation/rsbuild-plugin';

export default {
  plugins: [
    pluginModuleFederation({
      name: 'remote1',
      exposes: {
        './export-app': './src/export-app.tsx',
      },
      bridge: {
        // Enable Bridge Router routing capabilities, default is true
        enableBridgeRouter: true, 
      }
    }),
  ],
};

#Configuration Description

  • enableBridgeRouter: true (default) - Automatically handles basename and routing coordination, supports React Router v5, v6, v7
  • enableBridgeRouter: false - Disables Bridge's default routing proxy capabilities, users need to handle routing integration manually
Important

When enabling Bridge Router, do not configure react-router-dom as a shared dependency, otherwise it will cause routing functionality issues.

#createBridgeComponent API Reference

#Function Signature

function createBridgeComponent<T = any>(
  bridgeInfo: Omit<ProviderFnParams<T>, 'createRoot'>
): () => {
  render(info: RenderParams): Promise<void>;
  destroy(info: DestroyParams): void;
}

#ProviderFnParams<T>

Bridge component configuration parameters:

interface ProviderFnParams<T> {
  // Root component
  rootComponent: React.ComponentType<T>;
  
  // Custom render function (optional)
  render?: (App: React.ReactElement, id?: HTMLElement | string) => RootType | Promise<RootType>;
  
  // Custom createRoot function (optional, React 18+)
  createRoot?: (container: Element | DocumentFragment, options?: CreateRootOptions) => Root;
  
  // Default createRoot options (React 18+)
  defaultRootOptions?: CreateRootOptions;
}

#RenderParams

Render parameters interface:

interface RenderParams {
  moduleName?: string;
  basename?: string;
  memoryRoute?: {
    entryPath: string;
    initialState?: Record<string, unknown>;
  };
  dom: HTMLElement;                    // Target DOM element for rendering
  rootOptions?: CreateRootOptions;     // React 18+ createRoot options
  [key: string]: unknown;             // Other custom properties
}

#DestroyParams

Destroy parameters interface:

interface DestroyParams {
  moduleName: string;
  dom: HTMLElement;
}

#CreateRootOptions

React 18+ createRoot options:

interface CreateRootOptions {
  identifierPrefix?: string;                                    // Identifier prefix
  onRecoverableError?: (error: unknown) => void;              // Recoverable error handling
  transitionCallbacks?: unknown;                               // Transition callbacks
}

#Advanced Usage Examples

#Custom Rendering Logic

// ./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,
  
  // Custom render function
  render: (App, container) => {
    const root = createRoot(container as HTMLElement, {
      identifierPrefix: 'my-app-'
    });
    root.render(App);
    return root;
  },
  
  // Default createRoot options
  defaultRootOptions: {
    identifierPrefix: 'remote-app-',
    onRecoverableError: (error) => {
      console.error('Remote app recoverable error:', error);
    }
  }
});

#Supporting Multiple Exports

// ./src/export-app.tsx
import App from './App';
import Dashboard from './Dashboard';
import { createBridgeComponent } from '@module-federation/bridge-react';

// Export main application
export default createBridgeComponent({
  rootComponent: App
});

// Export dashboard component
export const dashboard = createBridgeComponent({
  rootComponent: Dashboard
});

Corresponding Module Federation configuration:

// rsbuild.config.ts
export default {
  plugins: [
    pluginModuleFederation({
      name: 'remote1',
      exposes: {
        './export-app': './src/export-app.tsx',     // Main application
        './dashboard': './src/export-app.tsx',      // Dashboard
      },
    }),
  ],
};

#Next Steps

After completing the export application configuration, you can continue reading Loading Remote Applications to learn how to load this remote application in a host application.