@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 +2 -10
- package/__tests__/bridge.spec.tsx +3 -37
- package/dist/index.cjs.js +92 -127
- package/dist/index.d.ts +7 -10
- package/dist/index.es.js +94 -129
- package/dist/router.cjs.js +12 -8
- package/dist/router.es.js +12 -8
- package/package.json +2 -12
- package/src/create.tsx +19 -14
- package/src/provider.tsx +33 -50
- package/src/remote/index.tsx +56 -92
- package/src/router.tsx +10 -8
- package/vite.config.ts +0 -29
- package/dist/router-v5.cjs.js +0 -15
- package/dist/router-v5.d.ts +0 -11
- package/dist/router-v5.es.js +0 -8
- package/dist/router-v6.cjs.js +0 -15
- package/dist/router-v6.d.ts +0 -11
- package/dist/router-v6.es.js +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,18 +1,10 @@
|
|
|
1
1
|
# @module-federation/bridge-react
|
|
2
2
|
|
|
3
|
-
## 0.0.0-next-
|
|
3
|
+
## 0.0.0-next-20240815094326
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
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(
|
|
49
|
-
return <div>life cycle render {
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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,
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
return (
|
|
301
|
-
|
|
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
|
|
335
|
-
const {
|
|
336
|
-
return /* @__PURE__ */ React__namespace.createElement(context.RouterContext.Provider, { value: {
|
|
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
|
-
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
-
|
|
382
|
-
|
|
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
|
-
|
|
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):
|
|
8
|
+
render(info: RenderFnParams & any): void;
|
|
10
9
|
destroy(info: {
|
|
11
10
|
dom: HTMLElement;
|
|
12
|
-
}):
|
|
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
|
-
}):
|
|
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
|
-
|
|
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 { }
|