Skip to content

Commit 0eb6d1b

Browse files
authored
refactor(bridge-react): modify the default mode of the bridge to legacy mode to reduce redundant code (#3711)
1 parent 4db1b0e commit 0eb6d1b

File tree

12 files changed

+70
-211
lines changed

12 files changed

+70
-211
lines changed

.changeset/wise-ways-occur.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@module-federation/bridge-react': patch
3+
'website-new': patch
4+
---
5+
6+
refactor(bridge-react): modify the default mode of the bridge to legacy mode to reduce redundant code

apps/router-demo/router-remote1-2001/src/export-App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import App from './App';
3-
import { createBridgeComponent } from '@module-federation/bridge-react/legacy';
3+
import { createBridgeComponent } from '@module-federation/bridge-react';
44

55
const provider = createBridgeComponent({
66
rootComponent: App,

apps/website-new/docs/en/practice/bridge/react-bridge.mdx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,14 @@
1616

1717
You can choose specific import paths based on the React version used in your project:
1818

19-
```jsx
20-
// Auto-detect React version (recommended for most scenarios)
19+
```tsx
20+
// Explicitly specify React 16/17 version (recommended for React 16/17)
2121
import { createBridgeComponent } from '@module-federation/bridge-react';
2222

23-
// Explicitly specify React 16/17 version (Legacy mode)
24-
import { createBridgeComponent } from '@module-federation/bridge-react/legacy';
25-
26-
// Explicitly specify React 18 version
23+
// Explicitly specify React 18 version (recommended for React 18)
2724
import { createBridgeComponent } from '@module-federation/bridge-react/v18';
2825

29-
// Explicitly specify React 19 version
26+
// Explicitly specify React 19 version (recommended for React 19)
3027
import { createBridgeComponent } from '@module-federation/bridge-react/v19';
3128
```
3229

apps/website-new/docs/zh/practice/bridge/react-bridge.mdx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,14 @@
1616

1717
您可以根据项目中使用的 React 版本,选择特定的导入方式:
1818

19-
```jsx
20-
// 自动检测 React 版本(适用于 React 16/17/18)
19+
```tsx
20+
// Explicitly specify React 16/17 version (recommended for React 16/17)
2121
import { createBridgeComponent } from '@module-federation/bridge-react';
2222

23-
// 明确指定 React 16/17 版本(Legacy 模式)
24-
import { createBridgeComponent } from '@module-federation/bridge-react/legacy';
25-
26-
// 明确指定 React 18 版本
23+
// Explicitly specify React 18 version (recommended for React 18)
2724
import { createBridgeComponent } from '@module-federation/bridge-react/v18';
2825

29-
// 明确指定 React 19 版本
26+
// Explicitly specify React 19 version (recommended for React 19)
3027
import { createBridgeComponent } from '@module-federation/bridge-react/v19';
3128
```
3229

packages/bridge/bridge-react/package.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@
2121
"import": "./dist/index.es.js",
2222
"require": "./dist/index.cjs.js"
2323
},
24-
"./legacy": {
25-
"types": "./dist/legacy.d.ts",
26-
"import": "./dist/legacy.es.js",
27-
"require": "./dist/legacy.cjs.js"
28-
},
2924
"./v18": {
3025
"types": "./dist/v18.d.ts",
3126
"import": "./dist/v18.es.js",
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
/**
2+
* Entry point for React 16/17 (legacy) specific bridge components
3+
* This file provides support for React 16 and 17 versions, using the traditional ReactDOM.render API
4+
*/
5+
export { createBridgeComponent } from './provider/versions/legacy';
16
export { createRemoteComponent } from './remote/create';
2-
export { createBridgeComponent } from './provider/create';
7+
export type { CreateRootOptions, Root } from './provider/versions/legacy';
38
export type {
49
ProviderParams,
5-
RenderFnParams,
10+
ProviderFnParams,
11+
RootType,
612
DestroyParams,
713
RenderParams,
814
} from './types';

packages/bridge/bridge-react/src/legacy.ts

Lines changed: 0 additions & 13 deletions
This file was deleted.

packages/bridge/bridge-react/src/provider/create.tsx

Lines changed: 0 additions & 171 deletions
This file was deleted.

packages/bridge/bridge-react/src/provider/versions/legacy.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,55 @@ export interface Root {
1616
unmount(): void;
1717
}
1818

19+
/**
20+
* Default createRoot function that automatically detects React version and uses the appropriate API(only support React 16/17, 18)
21+
*
22+
* Note: Users can also directly import version-specific bridge components:
23+
* - import { createBridgeComponent } from '@module-federation/bridge-react'
24+
* - import { createBridgeComponent } from '@module-federation/bridge-react/v18'
25+
* - import { createBridgeComponent } from '@module-federation/bridge-react/v19'
26+
*/
27+
1928
export function createReact16Or17Root(
2029
container: Element | DocumentFragment,
2130
): Root {
2231
return {
2332
render(children: React.ReactNode) {
33+
/**
34+
* Detect React version
35+
*/
36+
const reactVersion = ReactDOM.version || '';
37+
const isReact18 = reactVersion.startsWith('18');
38+
const isReact19 = reactVersion.startsWith('19');
39+
40+
/**
41+
* Throw error for React 19
42+
*
43+
* Note: Due to Module Federation sharing mechanism, the actual version detected here
44+
* might be 18 or 19, even if the application itself uses React 16/17.
45+
* This happens because in MF environments, different remote modules may share different React versions.
46+
* The console may throw warnings about version and API mismatches. If you need to resolve these issues,
47+
* consider disabling the shared configuration for React.
48+
*/
49+
if (isReact19) {
50+
throw new Error(
51+
`React 19 detected in legacy mode. This is not supported. ` +
52+
`Please use the version-specific import: ` +
53+
`import { createBridgeComponent } from '@module-federation/bridge-react/v19'`,
54+
);
55+
}
56+
57+
/**
58+
* Provide warning for React 18
59+
*/
60+
if (isReact18) {
61+
console.warn(
62+
`[Bridge-React] React 18 detected in legacy mode. ` +
63+
`For better compatibility, please use the version-specific import: ` +
64+
`import { createBridgeComponent } from '@module-federation/bridge-react/v18'`,
65+
);
66+
}
67+
2468
// @ts-ignore - React 17's render method is deprecated but still functional
2569
ReactDOM.render(children, container);
2670
},
@@ -34,8 +78,8 @@ export function createBridgeComponent<T = any>(
3478
bridgeInfo: Omit<ProviderFnParams<T>, 'createRoot'>,
3579
) {
3680
const fullBridgeInfo = {
37-
...bridgeInfo,
3881
createRoot: createReact16Or17Root,
82+
...bridgeInfo,
3983
} as unknown as ProviderFnParams<T>;
4084

4185
return createBaseBridgeComponent(fullBridgeInfo);

packages/bridge/bridge-react/src/provider/versions/v18.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ export function createBridgeComponent<T = any>(
3939
bridgeInfo: Omit<ProviderFnParams<T>, 'createRoot'>,
4040
) {
4141
const fullBridgeInfo = {
42-
...bridgeInfo,
4342
createRoot: createReact18Root,
43+
...bridgeInfo,
4444
} as unknown as ProviderFnParams<T>;
4545

4646
return createBaseBridgeComponent(fullBridgeInfo);

packages/bridge/bridge-react/src/provider/versions/v19.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ export function createBridgeComponent<T = any>(
4040
bridgeInfo: Omit<ProviderFnParams<T>, 'createRoot'>,
4141
) {
4242
const fullBridgeInfo = {
43-
...bridgeInfo,
4443
createRoot: createReact19Root,
44+
...bridgeInfo,
4545
} as unknown as ProviderFnParams<T>;
4646

4747
return createBaseBridgeComponent(fullBridgeInfo);

packages/bridge/bridge-react/vite.config.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ export default defineConfig({
2424
router: path.resolve(__dirname, 'src/router/default.tsx'),
2525
'router-v5': path.resolve(__dirname, 'src/router/v5.tsx'),
2626
'router-v6': path.resolve(__dirname, 'src/router/v6.tsx'),
27-
v16: path.resolve(__dirname, 'src/legacy.ts'),
28-
legacy: path.resolve(__dirname, 'src/legacy.ts'),
2927
v18: path.resolve(__dirname, 'src/v18.ts'),
3028
v19: path.resolve(__dirname, 'src/v19.ts'),
3129
},

0 commit comments

Comments
 (0)