@module-federation/bridge-react 0.0.0-next-20241015060033 → 0.0.0-next-20241016062654

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.
@@ -65,7 +65,8 @@ function WraperRouterProvider(props) {
65
65
  return /* @__PURE__ */ React.createElement(RouterProvider, { router: MemeoryRouterInstance });
66
66
  } else {
67
67
  const BrowserRouterInstance = createBrowserRouter(routers, {
68
- basename: routerContextProps.basename || (router == null ? void 0 : router.basename),
68
+ // In host app, the routerContextProps is {}, so we should use router.basename as fallback
69
+ basename: routerContextProps.basename || router.basename,
69
70
  future: router.future,
70
71
  window: router.window
71
72
  });
@@ -47,7 +47,8 @@ function WraperRouterProvider(props) {
47
47
  return /* @__PURE__ */ React__default.createElement(RouterProvider, { router: MemeoryRouterInstance });
48
48
  } else {
49
49
  const BrowserRouterInstance = createBrowserRouter(routers, {
50
- basename: routerContextProps.basename || (router == null ? void 0 : router.basename),
50
+ // In host app, the routerContextProps is {}, so we should use router.basename as fallback
51
+ basename: routerContextProps.basename || router.basename,
51
52
  future: router.future,
52
53
  window: router.window
53
54
  });
@@ -65,7 +65,7 @@ function WrapperRouterProvider(props) {
65
65
  return /* @__PURE__ */ React.createElement(RouterProvider, { router: MemeoryRouterInstance });
66
66
  } else {
67
67
  const BrowserRouterInstance = createBrowserRouter(routers, {
68
- basename: routerContextProps.basename || (router == null ? void 0 : router.basename),
68
+ basename: routerContextProps.basename,
69
69
  future: router.future,
70
70
  window: router.window
71
71
  });
package/dist/router.es.js CHANGED
@@ -47,7 +47,7 @@ function WrapperRouterProvider(props) {
47
47
  return /* @__PURE__ */ React__default.createElement(RouterProvider, { router: MemeoryRouterInstance });
48
48
  } else {
49
49
  const BrowserRouterInstance = createBrowserRouter(routers, {
50
- basename: routerContextProps.basename || (router == null ? void 0 : router.basename),
50
+ basename: routerContextProps.basename,
51
51
  future: router.future,
52
52
  window: router.window
53
53
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/bridge-react",
3
- "version": "0.0.0-next-20241015060033",
3
+ "version": "0.0.0-next-20241016062654",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,24 +35,23 @@
35
35
  "dependencies": {
36
36
  "@loadable/component": "^5.16.4",
37
37
  "react-error-boundary": "^4.0.13",
38
- "@module-federation/bridge-shared": "0.0.0-next-20241015060033"
38
+ "@module-federation/bridge-shared": "0.0.0-next-20241016062654"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=16.9.0",
42
42
  "react-dom": ">=16.9.0",
43
- "react-router-dom": ">=4",
44
- "@module-federation/runtime": "0.0.0-next-20241015060033"
43
+ "react-router-dom": ">=4"
45
44
  },
46
45
  "devDependencies": {
47
46
  "@testing-library/react": "15.0.7",
48
47
  "@types/react": "18.2.79",
49
- "@types/react-dom": "18.2.25",
48
+ "@types/react-dom": "18.3.0",
50
49
  "@vitejs/plugin-react": "^4.3.0",
51
50
  "@vitejs/plugin-vue": "^5.0.4",
52
51
  "@vitejs/plugin-vue-jsx": "^4.0.0",
53
52
  "jsdom": "^24.1.0",
54
- "react": "18.1.0",
55
- "react-dom": "18.1.0",
53
+ "react": "18.3.1",
54
+ "react-dom": "18.3.1",
56
55
  "react-router-dom": "6.22.3",
57
56
  "typescript": "^5.2.2",
58
57
  "vite": "^5.2.14",
package/project.json CHANGED
@@ -3,6 +3,7 @@
3
3
  "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
4
  "sourceRoot": "packages/bridge/bridge-react/src",
5
5
  "projectType": "library",
6
+ "tags": ["type:pkg"],
6
7
  "targets": {
7
8
  "build": {
8
9
  "executor": "nx:run-commands",
@@ -22,6 +23,5 @@
22
23
  ]
23
24
  }
24
25
  }
25
- },
26
- "tags": ["type:pkg"]
26
+ }
27
27
  }
package/src/create.tsx CHANGED
@@ -1,11 +1,11 @@
1
1
  import React, { forwardRef } from 'react';
2
+ import type { ProviderParams } from '@module-federation/bridge-shared';
3
+ import { LoggerInstance } from './utils';
2
4
  import {
3
5
  ErrorBoundary,
4
6
  ErrorBoundaryPropsWithComponent,
5
7
  } from 'react-error-boundary';
6
- import { LoggerInstance } from './utils';
7
8
  import RemoteApp from './remote';
8
- import type { ProviderParams } from '@module-federation/bridge-shared';
9
9
 
10
10
  export interface RenderFnParams extends ProviderParams {
11
11
  dom?: any;
package/src/provider.tsx CHANGED
@@ -2,37 +2,25 @@ import { useLayoutEffect, useRef, useState } from 'react';
2
2
  import * as React from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import ReactDOMClient from 'react-dom/client';
5
+ import { RouterContext } from './context';
5
6
  import type {
6
7
  ProviderParams,
7
8
  RenderFnParams,
8
9
  } from '@module-federation/bridge-shared';
9
- import { ErrorBoundary } from 'react-error-boundary';
10
- import { RouterContext } from './context';
11
10
  import { LoggerInstance, atLeastReact18 } from './utils';
11
+ import { ErrorBoundary } from 'react-error-boundary';
12
12
 
13
- type RenderParams = RenderFnParams & any;
14
- type DestroyParams = {
15
- dom: HTMLElement;
16
- };
17
13
  type RootType = HTMLElement | ReactDOMClient.Root;
18
-
19
- type BridgeHooks = {
20
- beforeBridgeRender?: (params: RenderFnParams) => any;
21
- afterBridgeRender?: (params: RenderFnParams) => any;
22
- beforeBridgeDestroy?: (params: DestroyParams) => any;
23
- afterBridgeDestroy?: (params: DestroyParams) => any;
24
- };
25
-
26
14
  type ProviderFnParams<T> = {
27
15
  rootComponent: React.ComponentType<T>;
28
16
  render?: (
29
17
  App: React.ReactElement,
30
18
  id?: HTMLElement | string,
31
19
  ) => RootType | Promise<RootType>;
32
- hooks?: BridgeHooks;
33
20
  };
21
+
34
22
  export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
35
- return (params: { hooks?: BridgeHooks }) => {
23
+ return () => {
36
24
  const rootMap = new Map<any, RootType>();
37
25
  const RawComponent = (info: { propsInfo: T; appInfo: ProviderParams }) => {
38
26
  const { appInfo, propsInfo, ...restProps } = info;
@@ -49,7 +37,7 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
49
37
  };
50
38
 
51
39
  return {
52
- async render(info: RenderParams) {
40
+ async render(info: RenderFnParams & any) {
53
41
  LoggerInstance.log(`createBridgeComponent render Info`, info);
54
42
  const {
55
43
  moduleName,
@@ -59,21 +47,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
59
47
  fallback,
60
48
  ...propsInfo
61
49
  } = info;
62
-
63
- const beforeBridgeRender =
64
- (bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeRender) ||
65
- params?.hooks?.beforeBridgeRender;
66
-
67
- // 可通过beforeBridgeRender返回一个props对象,用于传递额外的 props 参数
68
- const beforeBridgeRenderRes =
69
- beforeBridgeRender && beforeBridgeRender(info);
70
- const componentProps =
71
- beforeBridgeRenderRes &&
72
- typeof beforeBridgeRenderRes === 'object' &&
73
- beforeBridgeRenderRes?.extraProps
74
- ? beforeBridgeRenderRes?.extraProps
75
- : {};
76
-
77
50
  const rootComponentWithErrorBoundary = (
78
51
  // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
79
52
  <ErrorBoundary FallbackComponent={fallback}>
@@ -83,12 +56,11 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
83
56
  basename,
84
57
  memoryRoute,
85
58
  }}
86
- // propsInfo={propsInfo}
87
- propsInfo={{ propsInfo, ...componentProps } as T}
59
+ propsInfo={propsInfo}
88
60
  />
89
61
  </ErrorBoundary>
90
62
  );
91
- // call render function
63
+
92
64
  if (atLeastReact18(React)) {
93
65
  if (bridgeInfo?.render) {
94
66
  // in case bridgeInfo?.render is an async function, resolve this to promise
@@ -105,33 +77,11 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
105
77
  const renderFn = bridgeInfo?.render || ReactDOM.render;
106
78
  renderFn?.(rootComponentWithErrorBoundary, info.dom);
107
79
  }
108
-
109
- const afterBridgeRender =
110
- (bridgeInfo?.hooks && bridgeInfo?.hooks.afterBridgeDestroy) ||
111
- params?.hooks?.afterBridgeRender;
112
- afterBridgeRender && afterBridgeRender(info);
113
80
  },
114
-
115
- async destroy(info: DestroyParams) {
81
+ async destroy(info: { dom: HTMLElement }) {
116
82
  LoggerInstance.log(`createBridgeComponent destroy Info`, {
117
83
  dom: info.dom,
118
84
  });
119
-
120
- // call beforeBridgeDestroy hook
121
- if (
122
- bridgeInfo?.hooks &&
123
- bridgeInfo?.hooks.beforeBridgeDestroy &&
124
- typeof bridgeInfo?.hooks.beforeBridgeDestroy === 'function'
125
- ) {
126
- bridgeInfo.hooks.beforeBridgeDestroy(info);
127
- }
128
-
129
- const beforeBridgeDestroy =
130
- (bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeDestroy) ||
131
- params?.hooks?.beforeBridgeDestroy;
132
- beforeBridgeDestroy && beforeBridgeDestroy(info);
133
-
134
- // call destroy function
135
85
  if (atLeastReact18(React)) {
136
86
  const root = rootMap.get(info.dom);
137
87
  (root as ReactDOMClient.Root)?.unmount();
@@ -139,11 +89,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
139
89
  } else {
140
90
  ReactDOM.unmountComponentAtNode(info.dom);
141
91
  }
142
-
143
- const afterBridgeDestroy =
144
- (bridgeInfo?.hooks && bridgeInfo?.hooks.afterBridgeDestroy) ||
145
- params?.hooks?.afterBridgeDestroy;
146
- afterBridgeDestroy && afterBridgeDestroy(info);
147
92
  },
148
93
  rawComponent: bridgeInfo.rootComponent,
149
94
  __BRIDGE_FN__: (_args: T) => {},
@@ -7,10 +7,9 @@ import React, {
7
7
  } from 'react';
8
8
  import * as ReactRouterDOM from 'react-router-dom';
9
9
  import type { ProviderParams } from '@module-federation/bridge-shared';
10
+ import { LoggerInstance, pathJoin } from '../utils';
10
11
  import { dispatchPopstateEnv } from '@module-federation/bridge-shared';
11
12
  import { ErrorBoundaryPropsWithComponent } from 'react-error-boundary';
12
- import { registerBridgeLifeCycle } from '../lifecycle';
13
- import { LoggerInstance, pathJoin } from '../utils';
14
13
 
15
14
  declare const __APP_VERSION__: string;
16
15
  export interface RenderFnParams extends ProviderParams {
@@ -40,7 +39,6 @@ const RemoteAppWrapper = forwardRef(function (
40
39
  props: RemoteAppParams & RenderFnParams,
41
40
  ref,
42
41
  ) {
43
- const bridgeHook = registerBridgeLifeCycle();
44
42
  const RemoteApp = () => {
45
43
  LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
46
44
  const {
@@ -80,13 +78,6 @@ const RemoteAppWrapper = forwardRef(function (
80
78
  `createRemoteComponent LazyComponent render >>>`,
81
79
  renderProps,
82
80
  );
83
-
84
- if (bridgeHook && bridgeHook?.lifecycle?.beforeBridgeRender) {
85
- bridgeHook?.lifecycle?.beforeBridgeRender.emit({
86
- ...renderProps,
87
- });
88
- }
89
-
90
81
  providerReturn.render(renderProps);
91
82
  });
92
83
 
@@ -98,16 +89,6 @@ const RemoteAppWrapper = forwardRef(function (
98
89
  `createRemoteComponent LazyComponent destroy >>>`,
99
90
  { moduleName, basename, dom: renderDom.current },
100
91
  );
101
- if (bridgeHook && bridgeHook?.lifecycle?.beforeBridgeDestroy) {
102
- bridgeHook?.lifecycle?.beforeBridgeDestroy.emit({
103
- moduleName,
104
- dom: renderDom.current,
105
- basename,
106
- memoryRoute,
107
- fallback,
108
- ...resProps,
109
- });
110
- }
111
92
  providerInfoRef.current?.destroy({
112
93
  dom: renderDom.current,
113
94
  });
package/src/router-v5.tsx CHANGED
@@ -2,6 +2,7 @@ import React, { useContext } from 'react';
2
2
  // The upper alias react-router-dom$ into this file avoids the loop
3
3
  // @ts-ignore
4
4
  import * as ReactRouterDom from 'react-router-dom/index.js';
5
+
5
6
  import { RouterContext } from './context';
6
7
  import { LoggerInstance } from './utils';
7
8
 
package/src/router-v6.tsx CHANGED
@@ -60,7 +60,8 @@ function WraperRouterProvider(
60
60
  return <RouterProvider router={MemeoryRouterInstance} />;
61
61
  } else {
62
62
  const BrowserRouterInstance = createBrowserRouter(routers, {
63
- basename: routerContextProps.basename || router?.basename,
63
+ // In host app, the routerContextProps is {}, so we should use router.basename as fallback
64
+ basename: routerContextProps.basename || router.basename,
64
65
  future: router.future,
65
66
  window: router.window,
66
67
  });
package/src/router.tsx CHANGED
@@ -59,7 +59,7 @@ function WrapperRouterProvider(
59
59
  return <RouterProvider router={MemeoryRouterInstance} />;
60
60
  } else {
61
61
  const BrowserRouterInstance = createBrowserRouter(routers, {
62
- basename: routerContextProps.basename || router?.basename,
62
+ basename: routerContextProps.basename,
63
63
  future: router.future,
64
64
  window: router.window,
65
65
  });
package/src/lifecycle.ts DELETED
@@ -1,29 +0,0 @@
1
- import { getInstance } from '@module-federation/runtime';
2
- import helper from '@module-federation/runtime/helpers';
3
-
4
- function registerBridgeLifeCycle() {
5
- const { registerPlugins, pluginHelper } = helper.global;
6
- const host = getInstance();
7
- const pluginSystem = new pluginHelper.PluginSystem({
8
- beforeBridgeRender: new pluginHelper.SyncHook<
9
- [Record<string, any>],
10
- void
11
- >(),
12
- beforeBridgeDestroy: new pluginHelper.SyncHook<
13
- [Record<string, any>],
14
- void
15
- >(),
16
- });
17
-
18
- if (host) {
19
- registerPlugins<typeof pluginSystem.lifecycle, typeof pluginSystem>(
20
- host?.options?.plugins,
21
- [pluginSystem],
22
- );
23
- return pluginSystem;
24
- }
25
-
26
- return null;
27
- }
28
-
29
- export { registerBridgeLifeCycle };