@module-federation/bridge-react 0.0.0-next-20241107071851 → 0.0.0-next-20241108091829
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 +4 -4
- package/dist/{context-BcyT-d0V.js → context-Dh6IUBWT.js} +20 -1
- package/dist/{context-BBLu8BlQ.cjs → context-DmzxwI_7.cjs} +19 -0
- package/dist/index.cjs.js +46 -50
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +45 -49
- package/dist/router-v5.cjs.js +1 -1
- package/dist/router-v5.es.js +1 -1
- package/dist/router-v6.cjs.js +1 -1
- package/dist/router-v6.es.js +1 -1
- package/dist/router.cjs.js +1 -1
- package/dist/router.es.js +1 -1
- package/package.json +4 -4
- package/src/provider.tsx +22 -22
- package/src/remote/index.tsx +25 -52
- package/src/utils.ts +21 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @module-federation/bridge-react
|
|
2
2
|
|
|
3
|
-
## 0.0.0-next-
|
|
3
|
+
## 0.0.0-next-20241108091829
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
- Updated dependencies [8712967]
|
|
9
9
|
- Updated dependencies [6db4c5f]
|
|
10
10
|
- Updated dependencies [3082116]
|
|
11
|
-
- @module-federation/runtime@0.0.0-next-
|
|
12
|
-
- @module-federation/sdk@0.0.0-next-
|
|
13
|
-
- @module-federation/bridge-shared@0.0.0-next-
|
|
11
|
+
- @module-federation/runtime@0.0.0-next-20241108091829
|
|
12
|
+
- @module-federation/sdk@0.0.0-next-20241108091829
|
|
13
|
+
- @module-federation/bridge-shared@0.0.0-next-20241108091829
|
|
14
14
|
|
|
15
15
|
## 0.7.0
|
|
16
16
|
|
|
@@ -328,10 +328,29 @@ function pathJoin(...args) {
|
|
|
328
328
|
}, "");
|
|
329
329
|
return res || "/";
|
|
330
330
|
}
|
|
331
|
+
const getModuleName = (id) => {
|
|
332
|
+
if (!id) {
|
|
333
|
+
return id;
|
|
334
|
+
}
|
|
335
|
+
const idArray = id.split("/");
|
|
336
|
+
if (idArray.length < 2) {
|
|
337
|
+
return id;
|
|
338
|
+
}
|
|
339
|
+
return idArray[0] + "/" + idArray[1];
|
|
340
|
+
};
|
|
341
|
+
const getRootDomDefaultClassName = (moduleName) => {
|
|
342
|
+
if (!moduleName) {
|
|
343
|
+
return "";
|
|
344
|
+
}
|
|
345
|
+
const name = getModuleName(moduleName).replace(/\@/, "").replace(/\//, "-");
|
|
346
|
+
return `bridge-root-component-${name}`;
|
|
347
|
+
};
|
|
331
348
|
const RouterContext = React__default.createContext(null);
|
|
332
349
|
export {
|
|
333
350
|
LoggerInstance as L,
|
|
334
351
|
RouterContext as R,
|
|
335
|
-
|
|
352
|
+
getModuleName as a,
|
|
353
|
+
atLeastReact18 as b,
|
|
354
|
+
getRootDomDefaultClassName as g,
|
|
336
355
|
pathJoin as p
|
|
337
356
|
};
|
|
@@ -329,8 +329,27 @@ function pathJoin(...args) {
|
|
|
329
329
|
}, "");
|
|
330
330
|
return res || "/";
|
|
331
331
|
}
|
|
332
|
+
const getModuleName = (id) => {
|
|
333
|
+
if (!id) {
|
|
334
|
+
return id;
|
|
335
|
+
}
|
|
336
|
+
const idArray = id.split("/");
|
|
337
|
+
if (idArray.length < 2) {
|
|
338
|
+
return id;
|
|
339
|
+
}
|
|
340
|
+
return idArray[0] + "/" + idArray[1];
|
|
341
|
+
};
|
|
342
|
+
const getRootDomDefaultClassName = (moduleName) => {
|
|
343
|
+
if (!moduleName) {
|
|
344
|
+
return "";
|
|
345
|
+
}
|
|
346
|
+
const name = getModuleName(moduleName).replace(/\@/, "").replace(/\//, "-");
|
|
347
|
+
return `bridge-root-component-${name}`;
|
|
348
|
+
};
|
|
332
349
|
const RouterContext = React.createContext(null);
|
|
333
350
|
exports.LoggerInstance = LoggerInstance;
|
|
334
351
|
exports.RouterContext = RouterContext;
|
|
335
352
|
exports.atLeastReact18 = atLeastReact18;
|
|
353
|
+
exports.getModuleName = getModuleName;
|
|
354
|
+
exports.getRootDomDefaultClassName = getRootDomDefaultClassName;
|
|
336
355
|
exports.pathJoin = pathJoin;
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const React = require("react");
|
|
4
|
-
const context = require("./context-
|
|
4
|
+
const context = require("./context-DmzxwI_7.cjs");
|
|
5
5
|
const ReactRouterDOM = require("react-router-dom");
|
|
6
6
|
const runtime = require("@module-federation/runtime");
|
|
7
7
|
const ReactDOM = require("react-dom");
|
|
@@ -122,20 +122,6 @@ function e() {
|
|
|
122
122
|
const t = new PopStateEvent("popstate", { state: window.history.state });
|
|
123
123
|
window.dispatchEvent(t);
|
|
124
124
|
}
|
|
125
|
-
const getModuleName = (id) => {
|
|
126
|
-
const idArray = id.split("/");
|
|
127
|
-
if (idArray.length < 2) {
|
|
128
|
-
return id;
|
|
129
|
-
}
|
|
130
|
-
return idArray[0] + "/" + idArray[1];
|
|
131
|
-
};
|
|
132
|
-
const getRootDomDefaultClassName = (moduleName) => {
|
|
133
|
-
if (!moduleName) {
|
|
134
|
-
return "";
|
|
135
|
-
}
|
|
136
|
-
const name = getModuleName(moduleName).replace(/\@/, "").replace(/\//, "-");
|
|
137
|
-
return `bridge-root-component-${name}`;
|
|
138
|
-
};
|
|
139
125
|
const RemoteAppWrapper = React.forwardRef(function(props, ref) {
|
|
140
126
|
const host = runtime.getInstance();
|
|
141
127
|
context.LoggerInstance.log(`RemoteAppWrapper host >>>`, host);
|
|
@@ -156,7 +142,7 @@ const RemoteAppWrapper = React.forwardRef(function(props, ref) {
|
|
|
156
142
|
const providerInfoRef = React.useRef(null);
|
|
157
143
|
React.useEffect(() => {
|
|
158
144
|
const renderTimeout = setTimeout(() => {
|
|
159
|
-
var _a, _b, _c, _d;
|
|
145
|
+
var _a, _b, _c, _d, _e, _f;
|
|
160
146
|
const providerReturn = providerInfo();
|
|
161
147
|
providerInfoRef.current = providerReturn;
|
|
162
148
|
let renderProps = {
|
|
@@ -172,45 +158,45 @@ const RemoteAppWrapper = React.forwardRef(function(props, ref) {
|
|
|
172
158
|
`createRemoteComponent LazyComponent render >>>`,
|
|
173
159
|
renderProps
|
|
174
160
|
);
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
...renderProps
|
|
178
|
-
});
|
|
179
|
-
const extraProps = beforeBridgeRenderRes && typeof beforeBridgeRenderRes === "object" && (beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps) ? beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps : {};
|
|
180
|
-
renderProps = {
|
|
181
|
-
...renderProps,
|
|
182
|
-
...extraProps
|
|
183
|
-
};
|
|
184
|
-
}
|
|
161
|
+
const beforeBridgeRenderRes = ((_c = (_b = (_a = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(renderProps)) || {};
|
|
162
|
+
renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
|
|
185
163
|
providerReturn.render(renderProps);
|
|
164
|
+
(_f = (_e = (_d = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeRender) == null ? void 0 : _f.emit(renderProps);
|
|
186
165
|
});
|
|
187
166
|
return () => {
|
|
188
167
|
clearTimeout(renderTimeout);
|
|
189
168
|
setTimeout(() => {
|
|
190
|
-
var _a, _b, _c, _d, _e, _f;
|
|
169
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
191
170
|
if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
|
|
192
171
|
context.LoggerInstance.log(
|
|
193
172
|
`createRemoteComponent LazyComponent destroy >>>`,
|
|
194
173
|
{ moduleName, basename, dom: renderDom.current }
|
|
195
174
|
);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
(_f = providerInfoRef.current) == null ? void 0 : _f.destroy({
|
|
175
|
+
(_d = (_c = (_b = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _b.lifecycle) == null ? void 0 : _c.beforeBridgeDestroy) == null ? void 0 : _d.emit({
|
|
176
|
+
moduleName,
|
|
177
|
+
dom: renderDom.current,
|
|
178
|
+
basename,
|
|
179
|
+
memoryRoute,
|
|
180
|
+
fallback,
|
|
181
|
+
...resProps
|
|
182
|
+
});
|
|
183
|
+
(_e = providerInfoRef.current) == null ? void 0 : _e.destroy({
|
|
184
|
+
moduleName,
|
|
207
185
|
dom: renderDom.current
|
|
208
186
|
});
|
|
187
|
+
(_h = (_g = (_f = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _f.lifecycle) == null ? void 0 : _g.afterBridgeDestroy) == null ? void 0 : _h.emit({
|
|
188
|
+
moduleName,
|
|
189
|
+
dom: renderDom.current,
|
|
190
|
+
basename,
|
|
191
|
+
memoryRoute,
|
|
192
|
+
fallback,
|
|
193
|
+
...resProps
|
|
194
|
+
});
|
|
209
195
|
}
|
|
210
196
|
});
|
|
211
197
|
};
|
|
212
198
|
}, []);
|
|
213
|
-
const rootComponentClassName = `${getRootDomDefaultClassName(moduleName)} ${props == null ? void 0 : props.className}`;
|
|
199
|
+
const rootComponentClassName = `${context.getRootDomDefaultClassName(moduleName)} ${props == null ? void 0 : props.className}`;
|
|
214
200
|
return /* @__PURE__ */ React.createElement(
|
|
215
201
|
"div",
|
|
216
202
|
{
|
|
@@ -386,7 +372,7 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
386
372
|
};
|
|
387
373
|
return {
|
|
388
374
|
async render(info) {
|
|
389
|
-
var _a, _b;
|
|
375
|
+
var _a, _b, _c, _d;
|
|
390
376
|
context.LoggerInstance.log(`createBridgeComponent render Info`, info);
|
|
391
377
|
const {
|
|
392
378
|
moduleName,
|
|
@@ -396,9 +382,12 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
396
382
|
fallback,
|
|
397
383
|
...propsInfo
|
|
398
384
|
} = info;
|
|
399
|
-
const
|
|
400
|
-
const
|
|
401
|
-
|
|
385
|
+
const moduleNameWithoutExpose = context.getModuleName(moduleName);
|
|
386
|
+
const instance = __FEDERATION__.__INSTANCES__.find(
|
|
387
|
+
(v) => v.name === moduleNameWithoutExpose
|
|
388
|
+
);
|
|
389
|
+
context.LoggerInstance.log(`createBridgeComponent remote instance`, instance);
|
|
390
|
+
const beforeBridgeRenderRes = ((_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(info)) || {};
|
|
402
391
|
const rootComponentWithErrorBoundary = (
|
|
403
392
|
// set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
|
|
404
393
|
/* @__PURE__ */ React__namespace.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React__namespace.createElement(
|
|
@@ -409,7 +398,7 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
409
398
|
basename,
|
|
410
399
|
memoryRoute
|
|
411
400
|
},
|
|
412
|
-
propsInfo: { ...propsInfo, ...extraProps }
|
|
401
|
+
propsInfo: { ...propsInfo, ...beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps }
|
|
413
402
|
}
|
|
414
403
|
))
|
|
415
404
|
);
|
|
@@ -427,16 +416,24 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
427
416
|
const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
|
|
428
417
|
renderFn == null ? void 0 : renderFn(rootComponentWithErrorBoundary, info.dom);
|
|
429
418
|
}
|
|
430
|
-
const afterBridgeRender = (bridgeInfo == null ? void 0 : bridgeInfo.hooks) && (bridgeInfo == null ? void 0 : bridgeInfo.hooks.afterBridgeDestroy) || ((
|
|
419
|
+
const afterBridgeRender = (bridgeInfo == null ? void 0 : bridgeInfo.hooks) && (bridgeInfo == null ? void 0 : bridgeInfo.hooks.afterBridgeDestroy) || ((_d = params == null ? void 0 : params.hooks) == null ? void 0 : _d.afterBridgeRender);
|
|
431
420
|
afterBridgeRender && afterBridgeRender(info);
|
|
432
421
|
},
|
|
433
422
|
async destroy(info) {
|
|
434
|
-
var _a, _b;
|
|
423
|
+
var _a, _b, _c, _d, _e, _f;
|
|
435
424
|
context.LoggerInstance.log(`createBridgeComponent destroy Info`, {
|
|
436
425
|
dom: info.dom
|
|
437
426
|
});
|
|
438
|
-
const
|
|
439
|
-
|
|
427
|
+
const moduleNameWithoutExpose = context.getModuleName(info.moduleName);
|
|
428
|
+
context.LoggerInstance.log(
|
|
429
|
+
`createBridgeComponent remote module without expose name >>>`,
|
|
430
|
+
moduleNameWithoutExpose
|
|
431
|
+
);
|
|
432
|
+
const instance = __FEDERATION__.__INSTANCES__.find(
|
|
433
|
+
(v) => v.name === moduleNameWithoutExpose
|
|
434
|
+
);
|
|
435
|
+
context.LoggerInstance.log(`createBridgeComponent remote instance`, instance);
|
|
436
|
+
(_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeDestroy) == null ? void 0 : _c.emit(info);
|
|
440
437
|
if (context.atLeastReact18(React__namespace)) {
|
|
441
438
|
const root = rootMap.get(info.dom);
|
|
442
439
|
root == null ? void 0 : root.unmount();
|
|
@@ -444,8 +441,7 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
444
441
|
} else {
|
|
445
442
|
ReactDOM.unmountComponentAtNode(info.dom);
|
|
446
443
|
}
|
|
447
|
-
|
|
448
|
-
afterBridgeDestroy && afterBridgeDestroy(info);
|
|
444
|
+
(_f = (_e = (_d = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeDestroy) == null ? void 0 : _f.emit(info);
|
|
449
445
|
},
|
|
450
446
|
rawComponent: bridgeInfo.rootComponent,
|
|
451
447
|
__BRIDGE_FN__: (_args) => {
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,7 @@ export declare function createRemoteComponent<T, E extends keyof T>(info: {
|
|
|
29
29
|
}): 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>>;
|
|
30
30
|
|
|
31
31
|
declare type DestroyParams = {
|
|
32
|
+
moduleName: string;
|
|
32
33
|
dom: HTMLElement;
|
|
33
34
|
};
|
|
34
35
|
|
package/dist/index.es.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import React__default, { createContext, Component, createElement, isValidElement, forwardRef, useRef, useEffect, useContext, useState } from "react";
|
|
3
|
-
import { L as LoggerInstance, p as pathJoin, a as atLeastReact18, R as RouterContext } from "./context-
|
|
3
|
+
import { L as LoggerInstance, g as getRootDomDefaultClassName, p as pathJoin, a as getModuleName, b as atLeastReact18, R as RouterContext } from "./context-Dh6IUBWT.js";
|
|
4
4
|
import * as ReactRouterDOM from "react-router-dom";
|
|
5
5
|
import { getInstance } from "@module-federation/runtime";
|
|
6
6
|
import ReactDOM from "react-dom";
|
|
@@ -103,20 +103,6 @@ function e() {
|
|
|
103
103
|
const t = new PopStateEvent("popstate", { state: window.history.state });
|
|
104
104
|
window.dispatchEvent(t);
|
|
105
105
|
}
|
|
106
|
-
const getModuleName = (id) => {
|
|
107
|
-
const idArray = id.split("/");
|
|
108
|
-
if (idArray.length < 2) {
|
|
109
|
-
return id;
|
|
110
|
-
}
|
|
111
|
-
return idArray[0] + "/" + idArray[1];
|
|
112
|
-
};
|
|
113
|
-
const getRootDomDefaultClassName = (moduleName) => {
|
|
114
|
-
if (!moduleName) {
|
|
115
|
-
return "";
|
|
116
|
-
}
|
|
117
|
-
const name = getModuleName(moduleName).replace(/\@/, "").replace(/\//, "-");
|
|
118
|
-
return `bridge-root-component-${name}`;
|
|
119
|
-
};
|
|
120
106
|
const RemoteAppWrapper = forwardRef(function(props, ref) {
|
|
121
107
|
const host = getInstance();
|
|
122
108
|
LoggerInstance.log(`RemoteAppWrapper host >>>`, host);
|
|
@@ -137,7 +123,7 @@ const RemoteAppWrapper = forwardRef(function(props, ref) {
|
|
|
137
123
|
const providerInfoRef = useRef(null);
|
|
138
124
|
useEffect(() => {
|
|
139
125
|
const renderTimeout = setTimeout(() => {
|
|
140
|
-
var _a, _b, _c, _d;
|
|
126
|
+
var _a, _b, _c, _d, _e, _f;
|
|
141
127
|
const providerReturn = providerInfo();
|
|
142
128
|
providerInfoRef.current = providerReturn;
|
|
143
129
|
let renderProps = {
|
|
@@ -153,40 +139,40 @@ const RemoteAppWrapper = forwardRef(function(props, ref) {
|
|
|
153
139
|
`createRemoteComponent LazyComponent render >>>`,
|
|
154
140
|
renderProps
|
|
155
141
|
);
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
...renderProps
|
|
159
|
-
});
|
|
160
|
-
const extraProps = beforeBridgeRenderRes && typeof beforeBridgeRenderRes === "object" && (beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps) ? beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps : {};
|
|
161
|
-
renderProps = {
|
|
162
|
-
...renderProps,
|
|
163
|
-
...extraProps
|
|
164
|
-
};
|
|
165
|
-
}
|
|
142
|
+
const beforeBridgeRenderRes = ((_c = (_b = (_a = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(renderProps)) || {};
|
|
143
|
+
renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
|
|
166
144
|
providerReturn.render(renderProps);
|
|
145
|
+
(_f = (_e = (_d = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeRender) == null ? void 0 : _f.emit(renderProps);
|
|
167
146
|
});
|
|
168
147
|
return () => {
|
|
169
148
|
clearTimeout(renderTimeout);
|
|
170
149
|
setTimeout(() => {
|
|
171
|
-
var _a, _b, _c, _d, _e, _f;
|
|
150
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
172
151
|
if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
|
|
173
152
|
LoggerInstance.log(
|
|
174
153
|
`createRemoteComponent LazyComponent destroy >>>`,
|
|
175
154
|
{ moduleName, basename, dom: renderDom.current }
|
|
176
155
|
);
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
(_f = providerInfoRef.current) == null ? void 0 : _f.destroy({
|
|
156
|
+
(_d = (_c = (_b = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _b.lifecycle) == null ? void 0 : _c.beforeBridgeDestroy) == null ? void 0 : _d.emit({
|
|
157
|
+
moduleName,
|
|
158
|
+
dom: renderDom.current,
|
|
159
|
+
basename,
|
|
160
|
+
memoryRoute,
|
|
161
|
+
fallback,
|
|
162
|
+
...resProps
|
|
163
|
+
});
|
|
164
|
+
(_e = providerInfoRef.current) == null ? void 0 : _e.destroy({
|
|
165
|
+
moduleName,
|
|
188
166
|
dom: renderDom.current
|
|
189
167
|
});
|
|
168
|
+
(_h = (_g = (_f = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _f.lifecycle) == null ? void 0 : _g.afterBridgeDestroy) == null ? void 0 : _h.emit({
|
|
169
|
+
moduleName,
|
|
170
|
+
dom: renderDom.current,
|
|
171
|
+
basename,
|
|
172
|
+
memoryRoute,
|
|
173
|
+
fallback,
|
|
174
|
+
...resProps
|
|
175
|
+
});
|
|
190
176
|
}
|
|
191
177
|
});
|
|
192
178
|
};
|
|
@@ -367,7 +353,7 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
367
353
|
};
|
|
368
354
|
return {
|
|
369
355
|
async render(info) {
|
|
370
|
-
var _a, _b;
|
|
356
|
+
var _a, _b, _c, _d;
|
|
371
357
|
LoggerInstance.log(`createBridgeComponent render Info`, info);
|
|
372
358
|
const {
|
|
373
359
|
moduleName,
|
|
@@ -377,9 +363,12 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
377
363
|
fallback,
|
|
378
364
|
...propsInfo
|
|
379
365
|
} = info;
|
|
380
|
-
const
|
|
381
|
-
const
|
|
382
|
-
|
|
366
|
+
const moduleNameWithoutExpose = getModuleName(moduleName);
|
|
367
|
+
const instance = __FEDERATION__.__INSTANCES__.find(
|
|
368
|
+
(v) => v.name === moduleNameWithoutExpose
|
|
369
|
+
);
|
|
370
|
+
LoggerInstance.log(`createBridgeComponent remote instance`, instance);
|
|
371
|
+
const beforeBridgeRenderRes = ((_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(info)) || {};
|
|
383
372
|
const rootComponentWithErrorBoundary = (
|
|
384
373
|
// set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
|
|
385
374
|
/* @__PURE__ */ React.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React.createElement(
|
|
@@ -390,7 +379,7 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
390
379
|
basename,
|
|
391
380
|
memoryRoute
|
|
392
381
|
},
|
|
393
|
-
propsInfo: { ...propsInfo, ...extraProps }
|
|
382
|
+
propsInfo: { ...propsInfo, ...beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps }
|
|
394
383
|
}
|
|
395
384
|
))
|
|
396
385
|
);
|
|
@@ -408,16 +397,24 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
408
397
|
const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
|
|
409
398
|
renderFn == null ? void 0 : renderFn(rootComponentWithErrorBoundary, info.dom);
|
|
410
399
|
}
|
|
411
|
-
const afterBridgeRender = (bridgeInfo == null ? void 0 : bridgeInfo.hooks) && (bridgeInfo == null ? void 0 : bridgeInfo.hooks.afterBridgeDestroy) || ((
|
|
400
|
+
const afterBridgeRender = (bridgeInfo == null ? void 0 : bridgeInfo.hooks) && (bridgeInfo == null ? void 0 : bridgeInfo.hooks.afterBridgeDestroy) || ((_d = params == null ? void 0 : params.hooks) == null ? void 0 : _d.afterBridgeRender);
|
|
412
401
|
afterBridgeRender && afterBridgeRender(info);
|
|
413
402
|
},
|
|
414
403
|
async destroy(info) {
|
|
415
|
-
var _a, _b;
|
|
404
|
+
var _a, _b, _c, _d, _e, _f;
|
|
416
405
|
LoggerInstance.log(`createBridgeComponent destroy Info`, {
|
|
417
406
|
dom: info.dom
|
|
418
407
|
});
|
|
419
|
-
const
|
|
420
|
-
|
|
408
|
+
const moduleNameWithoutExpose = getModuleName(info.moduleName);
|
|
409
|
+
LoggerInstance.log(
|
|
410
|
+
`createBridgeComponent remote module without expose name >>>`,
|
|
411
|
+
moduleNameWithoutExpose
|
|
412
|
+
);
|
|
413
|
+
const instance = __FEDERATION__.__INSTANCES__.find(
|
|
414
|
+
(v) => v.name === moduleNameWithoutExpose
|
|
415
|
+
);
|
|
416
|
+
LoggerInstance.log(`createBridgeComponent remote instance`, instance);
|
|
417
|
+
(_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeDestroy) == null ? void 0 : _c.emit(info);
|
|
421
418
|
if (atLeastReact18(React)) {
|
|
422
419
|
const root = rootMap.get(info.dom);
|
|
423
420
|
root == null ? void 0 : root.unmount();
|
|
@@ -425,8 +422,7 @@ function createBridgeComponent(bridgeInfo) {
|
|
|
425
422
|
} else {
|
|
426
423
|
ReactDOM.unmountComponentAtNode(info.dom);
|
|
427
424
|
}
|
|
428
|
-
|
|
429
|
-
afterBridgeDestroy && afterBridgeDestroy(info);
|
|
425
|
+
(_f = (_e = (_d = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeDestroy) == null ? void 0 : _f.emit(info);
|
|
430
426
|
},
|
|
431
427
|
rawComponent: bridgeInfo.rootComponent,
|
|
432
428
|
__BRIDGE_FN__: (_args) => {
|
package/dist/router-v5.cjs.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const React = require("react");
|
|
4
4
|
const ReactRouterDom$1 = require("react-router-dom/index.js");
|
|
5
|
-
const context = require("./context-
|
|
5
|
+
const context = require("./context-DmzxwI_7.cjs");
|
|
6
6
|
const ReactRouterDom = require("react-router-dom/index.js");
|
|
7
7
|
function _interopNamespaceDefault(e) {
|
|
8
8
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
package/dist/router-v5.es.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React__default, { useContext } from "react";
|
|
2
2
|
import * as ReactRouterDom$1 from "react-router-dom/index.js";
|
|
3
|
-
import { R as RouterContext, L as LoggerInstance } from "./context-
|
|
3
|
+
import { R as RouterContext, L as LoggerInstance } from "./context-Dh6IUBWT.js";
|
|
4
4
|
export * from "react-router-dom/index.js";
|
|
5
5
|
function WraperRouter(props) {
|
|
6
6
|
const { basename, ...propsRes } = props;
|
package/dist/router-v6.cjs.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const React = require("react");
|
|
4
4
|
const ReactRouterDom = require("react-router-dom/dist/index.js");
|
|
5
|
-
const context = require("./context-
|
|
5
|
+
const context = require("./context-DmzxwI_7.cjs");
|
|
6
6
|
function _interopNamespaceDefault(e) {
|
|
7
7
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
8
8
|
if (e) {
|
package/dist/router-v6.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default, { useContext } from "react";
|
|
2
2
|
import * as ReactRouterDom from "react-router-dom/dist/index.js";
|
|
3
3
|
export * from "react-router-dom/dist/index.js";
|
|
4
|
-
import { R as RouterContext, L as LoggerInstance } from "./context-
|
|
4
|
+
import { R as RouterContext, L as LoggerInstance } from "./context-Dh6IUBWT.js";
|
|
5
5
|
function WraperRouter(props) {
|
|
6
6
|
const { basename, ...propsRes } = props;
|
|
7
7
|
const routerContextProps = useContext(RouterContext) || {};
|
package/dist/router.cjs.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const React = require("react");
|
|
4
4
|
const ReactRouterDom = require("react-router-dom/");
|
|
5
|
-
const context = require("./context-
|
|
5
|
+
const context = require("./context-DmzxwI_7.cjs");
|
|
6
6
|
function _interopNamespaceDefault(e) {
|
|
7
7
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
8
8
|
if (e) {
|
package/dist/router.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default, { useContext } from "react";
|
|
2
2
|
import * as ReactRouterDom from "react-router-dom/";
|
|
3
3
|
export * from "react-router-dom/";
|
|
4
|
-
import { R as RouterContext, L as LoggerInstance } from "./context-
|
|
4
|
+
import { R as RouterContext, L as LoggerInstance } from "./context-Dh6IUBWT.js";
|
|
5
5
|
function WrapperRouter(props) {
|
|
6
6
|
const { basename, ...propsRes } = props;
|
|
7
7
|
const routerContextProps = useContext(RouterContext) || {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@module-federation/bridge-react",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20241108091829",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -41,14 +41,14 @@
|
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@loadable/component": "^5.16.4",
|
|
43
43
|
"react-error-boundary": "^4.0.13",
|
|
44
|
-
"@module-federation/bridge-shared": "0.0.0-next-
|
|
45
|
-
"@module-federation/sdk": "0.0.0-next-
|
|
44
|
+
"@module-federation/bridge-shared": "0.0.0-next-20241108091829",
|
|
45
|
+
"@module-federation/sdk": "0.0.0-next-20241108091829"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"react": ">=16.9.0",
|
|
49
49
|
"react-dom": ">=16.9.0",
|
|
50
50
|
"react-router-dom": ">=4",
|
|
51
|
-
"@module-federation/runtime": "0.0.0-next-
|
|
51
|
+
"@module-federation/runtime": "0.0.0-next-20241108091829"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@testing-library/react": "15.0.7",
|
package/src/provider.tsx
CHANGED
|
@@ -8,10 +8,11 @@ import type {
|
|
|
8
8
|
} from '@module-federation/bridge-shared';
|
|
9
9
|
import { ErrorBoundary } from 'react-error-boundary';
|
|
10
10
|
import { RouterContext } from './context';
|
|
11
|
-
import { LoggerInstance, atLeastReact18 } from './utils';
|
|
11
|
+
import { LoggerInstance, atLeastReact18, getModuleName } from './utils';
|
|
12
12
|
|
|
13
13
|
type RenderParams = RenderFnParams & any;
|
|
14
14
|
type DestroyParams = {
|
|
15
|
+
moduleName: string;
|
|
15
16
|
dom: HTMLElement;
|
|
16
17
|
};
|
|
17
18
|
type RootType = HTMLElement | ReactDOMClient.Root;
|
|
@@ -60,19 +61,14 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
60
61
|
...propsInfo
|
|
61
62
|
} = info;
|
|
62
63
|
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
const moduleNameWithoutExpose = getModuleName(moduleName);
|
|
65
|
+
const instance = __FEDERATION__.__INSTANCES__.find(
|
|
66
|
+
(v) => v.name === moduleNameWithoutExpose,
|
|
67
|
+
);
|
|
68
|
+
LoggerInstance.log(`createBridgeComponent remote instance`, instance);
|
|
66
69
|
|
|
67
|
-
// you can return a props object through beforeBridgeRender to pass additional props parameters
|
|
68
70
|
const beforeBridgeRenderRes =
|
|
69
|
-
beforeBridgeRender
|
|
70
|
-
const extraProps =
|
|
71
|
-
beforeBridgeRenderRes &&
|
|
72
|
-
typeof beforeBridgeRenderRes === 'object' &&
|
|
73
|
-
beforeBridgeRenderRes?.extraProps
|
|
74
|
-
? beforeBridgeRenderRes?.extraProps
|
|
75
|
-
: {};
|
|
71
|
+
instance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(info) || {};
|
|
76
72
|
|
|
77
73
|
const rootComponentWithErrorBoundary = (
|
|
78
74
|
// set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
|
|
@@ -83,7 +79,9 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
83
79
|
basename,
|
|
84
80
|
memoryRoute,
|
|
85
81
|
}}
|
|
86
|
-
propsInfo={
|
|
82
|
+
propsInfo={
|
|
83
|
+
{ ...propsInfo, ...beforeBridgeRenderRes?.extraProps } as T
|
|
84
|
+
}
|
|
87
85
|
/>
|
|
88
86
|
</ErrorBoundary>
|
|
89
87
|
);
|
|
@@ -115,12 +113,17 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
115
113
|
LoggerInstance.log(`createBridgeComponent destroy Info`, {
|
|
116
114
|
dom: info.dom,
|
|
117
115
|
});
|
|
116
|
+
const moduleNameWithoutExpose = getModuleName(info.moduleName);
|
|
117
|
+
LoggerInstance.log(
|
|
118
|
+
`createBridgeComponent remote module without expose name >>>`,
|
|
119
|
+
moduleNameWithoutExpose,
|
|
120
|
+
);
|
|
121
|
+
const instance = __FEDERATION__.__INSTANCES__.find(
|
|
122
|
+
(v) => v.name === moduleNameWithoutExpose,
|
|
123
|
+
);
|
|
124
|
+
LoggerInstance.log(`createBridgeComponent remote instance`, instance);
|
|
118
125
|
|
|
119
|
-
|
|
120
|
-
(bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeDestroy) ||
|
|
121
|
-
params?.hooks?.beforeBridgeDestroy;
|
|
122
|
-
beforeBridgeDestroy && beforeBridgeDestroy(info);
|
|
123
|
-
|
|
126
|
+
instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit(info);
|
|
124
127
|
// call destroy function
|
|
125
128
|
if (atLeastReact18(React)) {
|
|
126
129
|
const root = rootMap.get(info.dom);
|
|
@@ -130,10 +133,7 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
130
133
|
ReactDOM.unmountComponentAtNode(info.dom);
|
|
131
134
|
}
|
|
132
135
|
|
|
133
|
-
|
|
134
|
-
(bridgeInfo?.hooks && bridgeInfo?.hooks.afterBridgeDestroy) ||
|
|
135
|
-
params?.hooks?.afterBridgeDestroy;
|
|
136
|
-
afterBridgeDestroy && afterBridgeDestroy(info);
|
|
136
|
+
instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(info);
|
|
137
137
|
},
|
|
138
138
|
rawComponent: bridgeInfo.rootComponent,
|
|
139
139
|
__BRIDGE_FN__: (_args: T) => {},
|
package/src/remote/index.tsx
CHANGED
|
@@ -9,27 +9,9 @@ import * as ReactRouterDOM from 'react-router-dom';
|
|
|
9
9
|
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
|
-
import { LoggerInstance, pathJoin } from '../utils';
|
|
12
|
+
import { LoggerInstance, pathJoin, getRootDomDefaultClassName } from '../utils';
|
|
13
13
|
import { getInstance } from '@module-federation/runtime';
|
|
14
14
|
|
|
15
|
-
export const getModuleName = (id: string) => {
|
|
16
|
-
// separate module name without detailed module path
|
|
17
|
-
// @vmok-e2e/edenx-demo-app2/button -> @vmok-e2e/edenx-demo-app2
|
|
18
|
-
const idArray = id.split('/');
|
|
19
|
-
if (idArray.length < 2) {
|
|
20
|
-
return id;
|
|
21
|
-
}
|
|
22
|
-
return idArray[0] + '/' + idArray[1];
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export const getRootDomDefaultClassName = (moduleName: string) => {
|
|
26
|
-
if (!moduleName) {
|
|
27
|
-
return '';
|
|
28
|
-
}
|
|
29
|
-
const name = getModuleName(moduleName).replace(/\@/, '').replace(/\//, '-');
|
|
30
|
-
return `bridge-root-component-${name}`;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
15
|
declare const __APP_VERSION__: string;
|
|
34
16
|
export interface RenderFnParams extends ProviderParams {
|
|
35
17
|
dom?: any;
|
|
@@ -100,27 +82,13 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
100
82
|
renderProps,
|
|
101
83
|
);
|
|
102
84
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
host?.bridgeHook?.lifecycle?.beforeBridgeRender
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
host?.bridgeHook?.lifecycle?.beforeBridgeRender.emit({
|
|
109
|
-
...renderProps,
|
|
110
|
-
});
|
|
111
|
-
const extraProps =
|
|
112
|
-
beforeBridgeRenderRes &&
|
|
113
|
-
typeof beforeBridgeRenderRes === 'object' &&
|
|
114
|
-
beforeBridgeRenderRes?.extraProps
|
|
115
|
-
? beforeBridgeRenderRes?.extraProps
|
|
116
|
-
: {};
|
|
117
|
-
|
|
118
|
-
renderProps = {
|
|
119
|
-
...renderProps,
|
|
120
|
-
...extraProps,
|
|
121
|
-
} as any;
|
|
122
|
-
}
|
|
85
|
+
// TODO: 寻找当前 remote 实例上的 hostName, 找到 host instance
|
|
86
|
+
const beforeBridgeRenderRes =
|
|
87
|
+
host?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(renderProps) ||
|
|
88
|
+
{};
|
|
89
|
+
renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
|
|
123
90
|
providerReturn.render(renderProps);
|
|
91
|
+
host?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(renderProps);
|
|
124
92
|
});
|
|
125
93
|
|
|
126
94
|
return () => {
|
|
@@ -131,21 +99,26 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
131
99
|
`createRemoteComponent LazyComponent destroy >>>`,
|
|
132
100
|
{ moduleName, basename, dom: renderDom.current },
|
|
133
101
|
);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
memoryRoute,
|
|
143
|
-
fallback,
|
|
144
|
-
...resProps,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
102
|
+
host?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit({
|
|
103
|
+
moduleName,
|
|
104
|
+
dom: renderDom.current,
|
|
105
|
+
basename,
|
|
106
|
+
memoryRoute,
|
|
107
|
+
fallback,
|
|
108
|
+
...resProps,
|
|
109
|
+
});
|
|
147
110
|
providerInfoRef.current?.destroy({
|
|
111
|
+
moduleName,
|
|
112
|
+
dom: renderDom.current,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
host?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit({
|
|
116
|
+
moduleName,
|
|
148
117
|
dom: renderDom.current,
|
|
118
|
+
basename,
|
|
119
|
+
memoryRoute,
|
|
120
|
+
fallback,
|
|
121
|
+
...resProps,
|
|
149
122
|
});
|
|
150
123
|
}
|
|
151
124
|
});
|
package/src/utils.ts
CHANGED
|
@@ -41,3 +41,24 @@ export function pathJoin(...args: string[]) {
|
|
|
41
41
|
}, '');
|
|
42
42
|
return res || '/';
|
|
43
43
|
}
|
|
44
|
+
|
|
45
|
+
export const getModuleName = (id: string) => {
|
|
46
|
+
if (!id) {
|
|
47
|
+
return id;
|
|
48
|
+
}
|
|
49
|
+
// separate module name without detailed module path
|
|
50
|
+
// @vmok-e2e/edenx-demo-app2/button -> @vmok-e2e/edenx-demo-app2
|
|
51
|
+
const idArray = id.split('/');
|
|
52
|
+
if (idArray.length < 2) {
|
|
53
|
+
return id;
|
|
54
|
+
}
|
|
55
|
+
return idArray[0] + '/' + idArray[1];
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const getRootDomDefaultClassName = (moduleName: string) => {
|
|
59
|
+
if (!moduleName) {
|
|
60
|
+
return '';
|
|
61
|
+
}
|
|
62
|
+
const name = getModuleName(moduleName).replace(/\@/, '').replace(/\//, '-');
|
|
63
|
+
return `bridge-root-component-${name}`;
|
|
64
|
+
};
|