@module-federation/bridge-react 0.0.0-next-20240814104132 → 0.0.0-next-20240815094326

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/CHANGELOG.md CHANGED
@@ -1,18 +1,10 @@
1
1
  # @module-federation/bridge-react
2
2
 
3
- ## 0.0.0-next-20240814104132
3
+ ## 0.0.0-next-20240815094326
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - 67fa05b: feat(@module-federation/bridge): enhance Bridge capabilities and fix some issues
8
- - Updated dependencies [67fa05b]
9
- - @module-federation/bridge-shared@0.0.0-next-20240814104132
10
-
11
- ## 0.4.0
12
-
13
- ### Patch Changes
14
-
15
- - @module-federation/bridge-shared@0.4.0
7
+ - @module-federation/bridge-shared@0.0.0-next-20240815094326
16
8
 
17
9
  ## 0.3.5
18
10
 
@@ -45,8 +45,8 @@ describe('bridge', () => {
45
45
  });
46
46
 
47
47
  it('createRemoteComponent', async () => {
48
- function Component({ props }: { props?: Record<string, any> }) {
49
- return <div>life cycle render {props?.msg}</div>;
48
+ function Component(info: { msg: string }) {
49
+ return <div>life cycle render {info.msg}</div>;
50
50
  }
51
51
  const BridgeComponent = createBridgeComponent({
52
52
  rootComponent: Component,
@@ -61,45 +61,11 @@ describe('bridge', () => {
61
61
  loading: <div>loading</div>,
62
62
  });
63
63
 
64
- const { container } = render(
65
- <RemoteComponent props={{ msg: 'hello world' }} />,
66
- );
67
- expect(getHtml(container)).toMatch('loading');
68
-
69
- await sleep(200);
70
- expect(getHtml(container)).toMatch('life cycle render');
71
- expect(getHtml(container)).toMatch('hello world');
72
- });
73
-
74
- it('createRemoteComponent and obtain ref property', async () => {
75
- const ref = {
76
- current: null,
77
- };
78
-
79
- function Component({ props }: { props?: Record<string, any> }) {
80
- return <div>life cycle render {props?.msg}</div>;
81
- }
82
- const BridgeComponent = createBridgeComponent({
83
- rootComponent: Component,
84
- });
85
- const RemoteComponent = createRemoteComponent({
86
- loader: async () => {
87
- return {
88
- default: BridgeComponent,
89
- };
90
- },
91
- fallback: () => <div></div>,
92
- loading: <div>loading</div>,
93
- });
94
-
95
- const { container } = render(
96
- <RemoteComponent ref={ref} props={{ msg: 'hello world' }} />,
97
- );
64
+ const { container } = render(<RemoteComponent msg={'hello world'} />);
98
65
  expect(getHtml(container)).toMatch('loading');
99
66
 
100
67
  await sleep(200);
101
68
  expect(getHtml(container)).toMatch('life cycle render');
102
69
  expect(getHtml(container)).toMatch('hello world');
103
- expect(ref.current).not.toBeNull();
104
70
  });
105
71
  });
package/dist/index.cjs.js CHANGED
@@ -117,71 +117,55 @@ function hasArrayChanged() {
117
117
  let b = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
118
118
  return a.length !== b.length || a.some((item, index) => !Object.is(item, b[index]));
119
119
  }
120
- const RemoteAppWrapper = React.forwardRef(function(props, ref) {
121
- const RemoteApp2 = () => {
122
- context.LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
123
- const {
124
- moduleName,
125
- memoryRoute,
126
- basename,
127
- providerInfo,
128
- className,
129
- style,
130
- fallback,
131
- ...resProps
132
- } = props;
133
- const rootRef = ref && "current" in ref ? ref : React.useRef(null);
134
- const renderDom = React.useRef(null);
135
- const providerInfoRef = React.useRef(null);
136
- React.useEffect(() => {
137
- const renderTimeout = setTimeout(() => {
138
- const providerReturn = providerInfo();
139
- providerInfoRef.current = providerReturn;
140
- const renderProps = {
141
- moduleName,
142
- dom: rootRef.current,
143
- basename,
144
- memoryRoute,
145
- fallback,
146
- ...resProps
147
- };
148
- renderDom.current = rootRef.current;
149
- context.LoggerInstance.log(
150
- `createRemoteComponent LazyComponent render >>>`,
151
- renderProps
152
- );
153
- providerReturn.render(renderProps);
154
- });
155
- return () => {
156
- clearTimeout(renderTimeout);
157
- setTimeout(() => {
158
- var _a, _b;
159
- if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
160
- context.LoggerInstance.log(
161
- `createRemoteComponent LazyComponent destroy >>>`,
162
- { moduleName, basename, dom: renderDom.current }
163
- );
164
- (_b = providerInfoRef.current) == null ? void 0 : _b.destroy({
165
- dom: renderDom.current
166
- });
167
- }
168
- });
120
+ const RemoteApp = ({
121
+ name,
122
+ memoryRoute,
123
+ basename,
124
+ providerInfo,
125
+ ...resProps
126
+ }) => {
127
+ const rootRef = React.useRef(null);
128
+ const renderDom = React.useRef(null);
129
+ const providerInfoRef = React.useRef(null);
130
+ React.useEffect(() => {
131
+ const renderTimeout = setTimeout(() => {
132
+ const providerReturn = providerInfo();
133
+ providerInfoRef.current = providerReturn;
134
+ const renderProps = {
135
+ name,
136
+ dom: rootRef.current,
137
+ basename,
138
+ memoryRoute,
139
+ ...resProps
169
140
  };
170
- }, []);
171
- return /* @__PURE__ */ React.createElement(
172
- "div",
173
- {
174
- className: props == null ? void 0 : props.className,
175
- style: props == null ? void 0 : props.style,
176
- ref: rootRef
177
- }
178
- );
179
- };
180
- RemoteApp2["__APP_VERSION__"] = "0.4.0";
181
- return /* @__PURE__ */ React.createElement(RemoteApp2, null);
182
- });
141
+ renderDom.current = rootRef.current;
142
+ context.LoggerInstance.log(
143
+ `createRemoteComponent LazyComponent render >>>`,
144
+ renderProps
145
+ );
146
+ providerReturn.render(renderProps);
147
+ });
148
+ return () => {
149
+ clearTimeout(renderTimeout);
150
+ setTimeout(() => {
151
+ var _a, _b;
152
+ if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
153
+ context.LoggerInstance.log(
154
+ `createRemoteComponent LazyComponent destroy >>>`,
155
+ { name, basename, dom: renderDom.current }
156
+ );
157
+ (_b = providerInfoRef.current) == null ? void 0 : _b.destroy({
158
+ dom: renderDom.current
159
+ });
160
+ }
161
+ });
162
+ };
163
+ }, []);
164
+ return /* @__PURE__ */ React.createElement("div", { ref: rootRef });
165
+ };
166
+ RemoteApp["__APP_VERSION__"] = "0.3.5";
183
167
  function withRouterData(WrappedComponent) {
184
- const Component = React.forwardRef(function(props, ref) {
168
+ return (props) => {
185
169
  var _a;
186
170
  let enableDispathPopstate = false;
187
171
  let routerContextVal;
@@ -239,13 +223,10 @@ function withRouterData(WrappedComponent) {
239
223
  setPathname(location.pathname);
240
224
  }, [location]);
241
225
  }
242
- return /* @__PURE__ */ React.createElement(WrappedComponent, { ...props, basename, ref });
243
- });
244
- return React.forwardRef(function(props, ref) {
245
- return /* @__PURE__ */ React.createElement(Component, { ...props, ref });
246
- });
226
+ return /* @__PURE__ */ React.createElement(WrappedComponent, { ...props, basename });
227
+ };
247
228
  }
248
- const RemoteApp = withRouterData(RemoteAppWrapper);
229
+ const RemoteApp$1 = withRouterData(RemoteApp);
249
230
  function createLazyRemoteComponent(info) {
250
231
  const exportName = (info == null ? void 0 : info.export) || "default";
251
232
  return React.lazy(async () => {
@@ -262,15 +243,13 @@ function createLazyRemoteComponent(info) {
262
243
  );
263
244
  const exportFn = m2[exportName];
264
245
  if (exportName in m2 && typeof exportFn === "function") {
265
- const RemoteAppComponent = React.forwardRef((props, ref) => {
246
+ const RemoteAppComponent = React.forwardRef((props, _ref) => {
266
247
  return /* @__PURE__ */ React.createElement(
267
- RemoteApp,
248
+ RemoteApp$1,
268
249
  {
269
- moduleName,
250
+ name: moduleName,
270
251
  providerInfo: exportFn,
271
252
  exportName: info.export || "default",
272
- fallback: info.fallback,
273
- ref,
274
253
  ...props
275
254
  }
276
255
  );
@@ -295,13 +274,10 @@ function createLazyRemoteComponent(info) {
295
274
  });
296
275
  }
297
276
  function createRemoteComponent(info) {
298
- return React.forwardRef((props, ref) => {
299
- const LazyComponent = createLazyRemoteComponent(info);
300
- return (
301
- // set ErrorBoundary for LazyComponent rendering error, usually caused by inner bridge logic render process
302
- /* @__PURE__ */ React.createElement(ErrorBoundary, { FallbackComponent: info.fallback }, /* @__PURE__ */ React.createElement(React.Suspense, { fallback: info.loading }, /* @__PURE__ */ React.createElement(LazyComponent, { ...props, ref })))
303
- );
304
- });
277
+ const LazyComponent = createLazyRemoteComponent(info);
278
+ return (props) => {
279
+ return /* @__PURE__ */ React.createElement(ErrorBoundary, { FallbackComponent: info.fallback }, /* @__PURE__ */ React.createElement(React.Suspense, { fallback: info.loading }, /* @__PURE__ */ React.createElement(LazyComponent, { ...props })));
280
+ };
305
281
  }
306
282
  var client = {};
307
283
  var m = ReactDOM;
@@ -331,65 +307,54 @@ function createBridgeComponent(bridgeInfo) {
331
307
  return () => {
332
308
  const rootMap = /* @__PURE__ */ new Map();
333
309
  const RawComponent = (info) => {
334
- const { appInfo, propsInfo, ...restProps } = info;
335
- const { moduleName, memoryRoute, basename = "/" } = appInfo;
336
- return /* @__PURE__ */ React__namespace.createElement(context.RouterContext.Provider, { value: { moduleName, basename, memoryRoute } }, /* @__PURE__ */ React__namespace.createElement(
337
- bridgeInfo.rootComponent,
338
- {
339
- ...propsInfo,
340
- basename,
341
- ...restProps
342
- }
343
- ));
310
+ const { appInfo, propsInfo } = info;
311
+ const { name, memoryRoute, basename = "/" } = appInfo;
312
+ return /* @__PURE__ */ React__namespace.createElement(context.RouterContext.Provider, { value: { name, basename, memoryRoute } }, /* @__PURE__ */ React__namespace.createElement(bridgeInfo.rootComponent, { ...propsInfo, basename }));
344
313
  };
345
314
  return {
346
- async render(info) {
315
+ render(info) {
347
316
  context.LoggerInstance.log(`createBridgeComponent render Info`, info);
348
- const {
349
- moduleName,
350
- dom,
351
- basename,
352
- memoryRoute,
353
- fallback,
354
- ...propsInfo
355
- } = info;
356
- const rootComponentWithErrorBoundary = (
357
- // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
358
- /* @__PURE__ */ React__namespace.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React__namespace.createElement(
359
- RawComponent,
360
- {
361
- appInfo: {
362
- moduleName,
363
- basename,
364
- memoryRoute
365
- },
366
- propsInfo
367
- }
368
- ))
369
- );
317
+ const { name, basename, memoryRoute, ...propsInfo } = info;
370
318
  if (context.atLeastReact18(React__namespace)) {
371
- if (bridgeInfo == null ? void 0 : bridgeInfo.render) {
372
- Promise.resolve(
373
- bridgeInfo == null ? void 0 : bridgeInfo.render(rootComponentWithErrorBoundary, dom)
374
- ).then((root) => rootMap.set(info.dom, root));
375
- } else {
376
- const root = client.createRoot(info.dom);
377
- root.render(rootComponentWithErrorBoundary);
378
- rootMap.set(info.dom, root);
379
- }
319
+ const root = client.createRoot(info.dom);
320
+ rootMap.set(info.dom, root);
321
+ root.render(
322
+ /* @__PURE__ */ React__namespace.createElement(
323
+ RawComponent,
324
+ {
325
+ propsInfo,
326
+ appInfo: {
327
+ name,
328
+ basename,
329
+ memoryRoute
330
+ }
331
+ }
332
+ )
333
+ );
380
334
  } else {
381
- const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
382
- renderFn == null ? void 0 : renderFn(rootComponentWithErrorBoundary, info.dom);
335
+ ReactDOM.render(
336
+ /* @__PURE__ */ React__namespace.createElement(
337
+ RawComponent,
338
+ {
339
+ propsInfo,
340
+ appInfo: {
341
+ name,
342
+ basename,
343
+ memoryRoute
344
+ }
345
+ }
346
+ ),
347
+ info.dom
348
+ );
383
349
  }
384
350
  },
385
- async destroy(info) {
351
+ destroy(info) {
386
352
  context.LoggerInstance.log(`createBridgeComponent destroy Info`, {
387
353
  dom: info.dom
388
354
  });
389
355
  if (context.atLeastReact18(React__namespace)) {
390
356
  const root = rootMap.get(info.dom);
391
357
  root == null ? void 0 : root.unmount();
392
- rootMap.delete(info.dom);
393
358
  } else {
394
359
  ReactDOM.unmountComponentAtNode(info.dom);
395
360
  }
package/dist/index.d.ts CHANGED
@@ -1,15 +1,14 @@
1
1
  import { ComponentType } from 'react';
2
2
  import { default as default_2 } from 'react';
3
- import { default as default_3 } from 'react-dom/client';
4
3
  import { ErrorInfo } from 'react';
5
4
  import { PropsWithChildren } from 'react';
6
5
  import * as React_2 from 'react';
7
6
 
8
7
  export declare function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>): () => {
9
- render(info: RenderFnParams & any): Promise<void>;
8
+ render(info: RenderFnParams & any): void;
10
9
  destroy(info: {
11
10
  dom: HTMLElement;
12
- }): Promise<void>;
11
+ }): void;
13
12
  rawComponent: React_2.ComponentType<T>;
14
13
  __BRIDGE_FN__: (_args: T) => void;
15
14
  };
@@ -19,7 +18,10 @@ export declare function createRemoteComponent<T, E extends keyof T>(info: {
19
18
  loading: default_2.ReactNode;
20
19
  fallback: ErrorBoundaryPropsWithComponent['FallbackComponent'];
21
20
  export?: E;
22
- }): default_2.ForwardRefExoticComponent<default_2.PropsWithoutRef<ProviderParams & ("__BRIDGE_FN__" extends keyof (T[E] extends (...args: any) => any ? ReturnType<T[E]> : never) ? (T[E] extends (...args: any) => any ? ReturnType<T[E]> : never)["__BRIDGE_FN__"] extends (...args: any) => any ? Parameters<(T[E] extends (...args: any) => any ? ReturnType<T[E]> : never)["__BRIDGE_FN__"]>[0] : {} : {})> & default_2.RefAttributes<unknown>>;
21
+ }): (props: {
22
+ basename?: ProviderParams['basename'];
23
+ memoryRoute?: ProviderParams['memoryRoute'];
24
+ } & ("__BRIDGE_FN__" extends keyof (T[E] extends (...args: any) => any ? ReturnType<T[E]> : never) ? (T[E] extends (...args: any) => any ? ReturnType<T[E]> : never)["__BRIDGE_FN__"] extends (...args: any) => any ? Parameters<(T[E] extends (...args: any) => any ? ReturnType<T[E]> : never)["__BRIDGE_FN__"]>[0] : {} : {})) => default_2.JSX.Element;
23
25
 
24
26
  declare type ErrorBoundaryPropsWithComponent = ErrorBoundarySharedProps & {
25
27
  fallback?: never;
@@ -47,23 +49,18 @@ declare type FallbackProps = {
47
49
 
48
50
  declare type ProviderFnParams<T> = {
49
51
  rootComponent: React_2.ComponentType<T>;
50
- render?: (App: React_2.ReactElement, id?: HTMLElement | string) => RootType | Promise<RootType>;
51
52
  };
52
53
 
53
54
  export declare interface ProviderParams {
54
- moduleName?: string;
55
+ name?: string;
55
56
  basename?: string;
56
57
  memoryRoute?: {
57
58
  entryPath: string;
58
59
  };
59
- style?: React.CSSProperties;
60
- className?: string;
61
60
  }
62
61
 
63
62
  export declare interface RenderFnParams extends ProviderParams {
64
63
  dom: HTMLElement;
65
64
  }
66
65
 
67
- declare type RootType = HTMLElement | default_3.Root;
68
-
69
66
  export { }