@module-federation/bridge-react 0.0.0-next-20241118060105 → 0.0.0-next-20241118092546

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/provider.tsx CHANGED
@@ -9,7 +9,7 @@ import type {
9
9
  import { ErrorBoundary } from 'react-error-boundary';
10
10
  import { RouterContext } from './context';
11
11
  import { LoggerInstance, atLeastReact18 } from './utils';
12
- import { getInstance } from '@module-federation/runtime';
12
+ import type { FederationHost } from '@module-federation/runtime';
13
13
 
14
14
  type RenderParams = RenderFnParams & {
15
15
  [key: string]: unknown;
@@ -26,13 +26,17 @@ type ProviderFnParams<T> = {
26
26
  App: React.ReactElement,
27
27
  id?: HTMLElement | string,
28
28
  ) => RootType | Promise<RootType>;
29
+ instance?: FederationHost;
29
30
  };
30
31
 
31
32
  export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
32
33
  return () => {
33
34
  const rootMap = new Map<any, RootType>();
34
- const instance = getInstance();
35
- LoggerInstance.log(`createBridgeComponent remote instance`, instance);
35
+ const { instance } = bridgeInfo;
36
+ LoggerInstance.log(
37
+ `createBridgeComponent instance from props >>>`,
38
+ instance,
39
+ );
36
40
 
37
41
  const RawComponent = (info: { propsInfo: T; appInfo: ProviderParams }) => {
38
42
  const { appInfo, propsInfo, ...restProps } = info;
@@ -95,7 +99,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
95
99
  const renderFn = bridgeInfo?.render || ReactDOM.render;
96
100
  renderFn?.(rootComponentWithErrorBoundary, info.dom);
97
101
  }
98
-
99
102
  instance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(info) || {};
100
103
  },
101
104
 
@@ -103,7 +106,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
103
106
  LoggerInstance.log(`createBridgeComponent destroy Info`, {
104
107
  dom: info.dom,
105
108
  });
106
-
107
109
  instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit(info);
108
110
 
109
111
  // call destroy function
@@ -115,7 +117,9 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
115
117
  ReactDOM.unmountComponentAtNode(info.dom);
116
118
  }
117
119
 
118
- instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(info);
120
+ (instance as any)?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(
121
+ info,
122
+ );
119
123
  },
120
124
  rawComponent: bridgeInfo.rootComponent,
121
125
  __BRIDGE_FN__: (_args: T) => {},
@@ -10,7 +10,7 @@ import type { ProviderParams } from '@module-federation/bridge-shared';
10
10
  import { dispatchPopstateEnv } from '@module-federation/bridge-shared';
11
11
  import { ErrorBoundaryPropsWithComponent } from 'react-error-boundary';
12
12
  import { LoggerInstance, pathJoin, getRootDomDefaultClassName } from '../utils';
13
- import { getInstance } from '@module-federation/runtime';
13
+ import type { FederationHost } from '@module-federation/runtime';
14
14
 
15
15
  declare const __APP_VERSION__: string;
16
16
  export interface RenderFnParams extends ProviderParams {
@@ -34,6 +34,7 @@ interface RemoteAppParams {
34
34
  providerInfo: NonNullable<RemoteModule['provider']>;
35
35
  exportName: string | number | symbol;
36
36
  fallback: ErrorBoundaryPropsWithComponent['FallbackComponent'];
37
+ instance: FederationHost;
37
38
  }
38
39
 
39
40
  const RemoteAppWrapper = forwardRef(function (
@@ -50,6 +51,7 @@ const RemoteAppWrapper = forwardRef(function (
50
51
  className,
51
52
  style,
52
53
  fallback,
54
+ instance,
53
55
  ...resProps
54
56
  } = props;
55
57
 
@@ -60,8 +62,7 @@ const RemoteAppWrapper = forwardRef(function (
60
62
 
61
63
  const renderDom: React.MutableRefObject<HTMLElement | null> = useRef(null);
62
64
  const providerInfoRef = useRef<any>(null);
63
- const hostInstance = getInstance();
64
- LoggerInstance.log(`RemoteAppWrapper hostInstance >>>`, hostInstance);
65
+ LoggerInstance.log(`RemoteAppWrapper instance from props >>>`, instance);
65
66
 
66
67
  useEffect(() => {
67
68
  const renderTimeout = setTimeout(() => {
@@ -84,18 +85,16 @@ const RemoteAppWrapper = forwardRef(function (
84
85
 
85
86
  LoggerInstance.log(
86
87
  `createRemoteComponent LazyComponent hostInstance >>>`,
87
- hostInstance,
88
+ instance,
88
89
  );
89
90
  const beforeBridgeRenderRes =
90
- hostInstance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(
91
+ instance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(
91
92
  renderProps,
92
93
  ) || {};
93
94
  // @ts-ignore
94
95
  renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
95
96
  providerReturn.render(renderProps);
96
- hostInstance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(
97
- renderProps,
98
- );
97
+ instance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(renderProps);
99
98
  });
100
99
 
101
100
  return () => {
@@ -107,7 +106,7 @@ const RemoteAppWrapper = forwardRef(function (
107
106
  { moduleName, basename, dom: renderDom.current },
108
107
  );
109
108
 
110
- hostInstance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit({
109
+ instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit({
111
110
  moduleName,
112
111
  dom: renderDom.current,
113
112
  basename,
@@ -121,7 +120,7 @@ const RemoteAppWrapper = forwardRef(function (
121
120
  dom: renderDom.current,
122
121
  });
123
122
 
124
- hostInstance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit({
123
+ instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit({
125
124
  moduleName,
126
125
  dom: renderDom.current,
127
126
  basename,
package/src/router-v5.tsx CHANGED
@@ -36,7 +36,7 @@ function WraperRouter(
36
36
  }
37
37
 
38
38
  // @ts-ignore
39
- // cause export directly from react-router-dom/index.js will cause build falied.
39
+ // because export directly from react-router-dom/index.js will cause build falied.
40
40
  // it will be replace by react-router-dom/index.js in building phase
41
41
  export * from 'react-router-dom/';
42
42
 
package/src/router-v6.tsx CHANGED
@@ -69,6 +69,7 @@ function WraperRouterProvider(
69
69
  }
70
70
  }
71
71
 
72
- export * from 'react-router-dom/dist/index.js';
72
+ // export * from 'react-router-dom/dist/index.js';
73
+ export * from 'react-router-dom/';
73
74
  export { WraperRouter as BrowserRouter };
74
75
  export { WraperRouterProvider as RouterProvider };
package/src/utils.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import React from 'react';
2
- import { FederationHost } from '@module-federation/runtime';
3
2
  import { createLogger } from '@module-federation/sdk';
4
3
 
5
4
  export const LoggerInstance = createLogger(
package/vite.config.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { defineConfig } from 'vite';
2
- import vue from '@vitejs/plugin-vue';
2
+ // import vue from '@vitejs/plugin-vue';
3
3
  import path from 'path';
4
4
  import dts from 'vite-plugin-dts';
5
- import react from '@vitejs/plugin-react';
5
+ // import react from '@vitejs/plugin-react';
6
6
  import packageJson from './package.json';
7
7
 
8
8
  const perDepsKeys = Object.keys(packageJson.peerDependencies);
@@ -21,6 +21,7 @@ export default defineConfig({
21
21
  lib: {
22
22
  entry: {
23
23
  index: path.resolve(__dirname, 'src/index.ts'),
24
+ plugin: path.resolve(__dirname, 'src/plugin.ts'),
24
25
  router: path.resolve(__dirname, 'src/router.tsx'),
25
26
  'router-v5': path.resolve(__dirname, 'src/router-v5.tsx'),
26
27
  'router-v6': path.resolve(__dirname, 'src/router-v6.tsx'),
@@ -36,7 +37,6 @@ export default defineConfig({
36
37
  'react-router-dom/',
37
38
  'react-router-dom/index.js',
38
39
  'react-router-dom/dist/index.js',
39
- '@module-federation/runtime',
40
40
  ],
41
41
  plugins: [
42
42
  {
@@ -44,13 +44,13 @@ export default defineConfig({
44
44
  generateBundle(options, bundle) {
45
45
  for (const fileName in bundle) {
46
46
  const chunk = bundle[fileName];
47
- // if (fileName.includes('router-v6') && chunk.type === 'chunk') {
48
- // chunk.code = chunk.code.replace(
49
- // // Match 'react-router-dom/' followed by single quotes, double quotes, or backticks, replacing only 'react-router-dom/' to react-router-v6 dist file structure
50
- // /react-router-dom\/(?=[\'\"\`])/g,
51
- // 'react-router-dom/dist/index.js',
52
- // );
53
- // }
47
+ if (fileName.includes('router-v6') && chunk.type === 'chunk') {
48
+ chunk.code = chunk.code.replace(
49
+ // Match 'react-router-dom/' followed by single quotes, double quotes, or backticks, replacing only 'react-router-dom/' to react-router-v6 dist file structure
50
+ /react-router-dom\/(?=[\'\"\`])/g,
51
+ 'react-router-dom/dist/index.js',
52
+ );
53
+ }
54
54
 
55
55
  if (fileName.includes('router-v5') && chunk.type === 'chunk') {
56
56
  chunk.code = chunk.code.replace(