@module-federation/bridge-react 0.0.0-next-20240818132231 → 0.0.0-next-20240819022441

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-20240818132231
3
+ ## 0.0.0-next-20240819022441
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - 49d6135: feat(@module-federation/bridge): enhance Bridge capabilities and fix some issues
8
- - Updated dependencies [49d6135]
9
- - @module-federation/bridge-shared@0.0.0-next-20240818132231
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-20240819022441
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,12 +274,10 @@ function createLazyRemoteComponent(info) {
295
274
  });
296
275
  }
297
276
  function createRemoteComponent(info) {
298
- return React.forwardRef(
299
- (props, ref) => {
300
- const LazyComponent = createLazyRemoteComponent(info);
301
- return /* @__PURE__ */ React.createElement(ErrorBoundary, { FallbackComponent: info.fallback }, /* @__PURE__ */ React.createElement(React.Suspense, { fallback: info.loading }, /* @__PURE__ */ React.createElement(LazyComponent, { ...props, ref })));
302
- }
303
- );
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
+ };
304
281
  }
305
282
  var client = {};
306
283
  var m = ReactDOM;
@@ -330,65 +307,54 @@ function createBridgeComponent(bridgeInfo) {
330
307
  return () => {
331
308
  const rootMap = /* @__PURE__ */ new Map();
332
309
  const RawComponent = (info) => {
333
- const { appInfo, propsInfo, ...restProps } = info;
334
- const { moduleName, memoryRoute, basename = "/" } = appInfo;
335
- return /* @__PURE__ */ React__namespace.createElement(context.RouterContext.Provider, { value: { moduleName, basename, memoryRoute } }, /* @__PURE__ */ React__namespace.createElement(
336
- bridgeInfo.rootComponent,
337
- {
338
- ...propsInfo,
339
- basename,
340
- ...restProps
341
- }
342
- ));
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 }));
343
313
  };
344
314
  return {
345
- async render(info) {
315
+ render(info) {
346
316
  context.LoggerInstance.log(`createBridgeComponent render Info`, info);
347
- const {
348
- moduleName,
349
- dom,
350
- basename,
351
- memoryRoute,
352
- fallback,
353
- ...propsInfo
354
- } = info;
355
- const rootComponentWithErrorBoundary = (
356
- // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
357
- /* @__PURE__ */ React__namespace.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React__namespace.createElement(
358
- RawComponent,
359
- {
360
- appInfo: {
361
- moduleName,
362
- basename,
363
- memoryRoute
364
- },
365
- propsInfo
366
- }
367
- ))
368
- );
317
+ const { name, basename, memoryRoute, ...propsInfo } = info;
369
318
  if (context.atLeastReact18(React__namespace)) {
370
- if (bridgeInfo == null ? void 0 : bridgeInfo.render) {
371
- Promise.resolve(
372
- bridgeInfo == null ? void 0 : bridgeInfo.render(rootComponentWithErrorBoundary, dom)
373
- ).then((root) => rootMap.set(info.dom, root));
374
- } else {
375
- const root = client.createRoot(info.dom);
376
- root.render(rootComponentWithErrorBoundary);
377
- rootMap.set(info.dom, root);
378
- }
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
+ );
379
334
  } else {
380
- const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
381
- 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
+ );
382
349
  }
383
350
  },
384
- async destroy(info) {
351
+ destroy(info) {
385
352
  context.LoggerInstance.log(`createBridgeComponent destroy Info`, {
386
353
  dom: info.dom
387
354
  });
388
355
  if (context.atLeastReact18(React__namespace)) {
389
356
  const root = rootMap.get(info.dom);
390
357
  root == null ? void 0 : root.unmount();
391
- rootMap.delete(info.dom);
392
358
  } else {
393
359
  ReactDOM.unmountComponentAtNode(info.dom);
394
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<HTMLDivElement>>;
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 { }