@module-federation/bridge-react 0.0.0-next-20241115035905 → 0.0.0-next-20241115100504
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 +5 -4
- package/dist/index..js +6 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.es.js +4 -429
- package/dist/{index.cjs.js → plugin-CfJaHqe4.cjs} +39 -14
- package/dist/plugin-qjDRExZS.js +457 -0
- package/dist/plugin..js +3 -0
- package/dist/plugin.d.ts +6 -0
- package/dist/plugin.es.js +4 -0
- package/dist/{router-v6.cjs.js → router-v6..js} +3 -2
- package/dist/router-v6.d.ts +1 -1
- package/dist/router-v6.es.js +7 -7
- package/package.json +15 -10
- package/src/create.tsx +12 -8
- package/src/index.ts +2 -0
- package/src/plugin.ts +31 -0
- package/src/provider.tsx +10 -6
- package/src/remote/index.tsx +9 -10
- package/src/router-v5.tsx +1 -1
- package/src/router-v6.tsx +2 -1
- package/src/utils.ts +0 -1
- package/vite.config.ts +12 -11
- /package/dist/{router-v5.cjs.js → router-v5..js} +0 -0
- /package/dist/{router.cjs.js → router..js} +0 -0
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FederationRuntimePlugin } from '@module-federation/enhanced/runtime';
|
|
2
|
+
import { createRemoteComponent } from './create';
|
|
3
|
+
import { createBridgeComponent } from './provider';
|
|
4
|
+
|
|
5
|
+
function BridgeReactPlugin(): FederationRuntimePlugin {
|
|
6
|
+
return {
|
|
7
|
+
name: 'bridge-react-plugin',
|
|
8
|
+
beforeInit(args) {
|
|
9
|
+
const originalCreateRemoteComponent = createRemoteComponent;
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
args.origin.createRemoteComponent = function (info) {
|
|
12
|
+
return originalCreateRemoteComponent({
|
|
13
|
+
...info,
|
|
14
|
+
instance: args.origin,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const originalCreateBridgeComponentt = createBridgeComponent; // 保存原始函数
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
args.origin.createBridgeComponent = function (info) {
|
|
21
|
+
return originalCreateBridgeComponentt({
|
|
22
|
+
...info,
|
|
23
|
+
instance: args.origin,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
return args;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default BridgeReactPlugin;
|
package/src/provider.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
import { ErrorBoundary } from 'react-error-boundary';
|
|
10
10
|
import { RouterContext } from './context';
|
|
11
11
|
import { LoggerInstance, atLeastReact18 } from './utils';
|
|
12
|
-
import {
|
|
12
|
+
import type { FederationHost } from '@module-federation/enhanced/runtime';
|
|
13
13
|
|
|
14
14
|
type RenderParams = RenderFnParams & {
|
|
15
15
|
[key: string]: unknown;
|
|
@@ -26,13 +26,17 @@ type ProviderFnParams<T> = {
|
|
|
26
26
|
App: React.ReactElement,
|
|
27
27
|
id?: HTMLElement | string,
|
|
28
28
|
) => RootType | Promise<RootType>;
|
|
29
|
+
instance?: FederationHost;
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
32
33
|
return () => {
|
|
33
34
|
const rootMap = new Map<any, RootType>();
|
|
34
|
-
const instance =
|
|
35
|
-
LoggerInstance.log(
|
|
35
|
+
const { instance } = bridgeInfo;
|
|
36
|
+
LoggerInstance.log(
|
|
37
|
+
`createBridgeComponent instance from props >>>`,
|
|
38
|
+
instance,
|
|
39
|
+
);
|
|
36
40
|
|
|
37
41
|
const RawComponent = (info: { propsInfo: T; appInfo: ProviderParams }) => {
|
|
38
42
|
const { appInfo, propsInfo, ...restProps } = info;
|
|
@@ -95,7 +99,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
95
99
|
const renderFn = bridgeInfo?.render || ReactDOM.render;
|
|
96
100
|
renderFn?.(rootComponentWithErrorBoundary, info.dom);
|
|
97
101
|
}
|
|
98
|
-
|
|
99
102
|
instance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(info) || {};
|
|
100
103
|
},
|
|
101
104
|
|
|
@@ -103,7 +106,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
103
106
|
LoggerInstance.log(`createBridgeComponent destroy Info`, {
|
|
104
107
|
dom: info.dom,
|
|
105
108
|
});
|
|
106
|
-
|
|
107
109
|
instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit(info);
|
|
108
110
|
|
|
109
111
|
// call destroy function
|
|
@@ -115,7 +117,9 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
115
117
|
ReactDOM.unmountComponentAtNode(info.dom);
|
|
116
118
|
}
|
|
117
119
|
|
|
118
|
-
instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(
|
|
120
|
+
(instance as any)?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(
|
|
121
|
+
info,
|
|
122
|
+
);
|
|
119
123
|
},
|
|
120
124
|
rawComponent: bridgeInfo.rootComponent,
|
|
121
125
|
__BRIDGE_FN__: (_args: T) => {},
|
package/src/remote/index.tsx
CHANGED
|
@@ -10,7 +10,7 @@ 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
12
|
import { LoggerInstance, pathJoin, getRootDomDefaultClassName } from '../utils';
|
|
13
|
-
import {
|
|
13
|
+
import type { FederationHost } from '@module-federation/enhanced/runtime';
|
|
14
14
|
|
|
15
15
|
declare const __APP_VERSION__: string;
|
|
16
16
|
export interface RenderFnParams extends ProviderParams {
|
|
@@ -34,6 +34,7 @@ interface RemoteAppParams {
|
|
|
34
34
|
providerInfo: NonNullable<RemoteModule['provider']>;
|
|
35
35
|
exportName: string | number | symbol;
|
|
36
36
|
fallback: ErrorBoundaryPropsWithComponent['FallbackComponent'];
|
|
37
|
+
instance: FederationHost;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
const RemoteAppWrapper = forwardRef(function (
|
|
@@ -50,6 +51,7 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
50
51
|
className,
|
|
51
52
|
style,
|
|
52
53
|
fallback,
|
|
54
|
+
instance,
|
|
53
55
|
...resProps
|
|
54
56
|
} = props;
|
|
55
57
|
|
|
@@ -60,8 +62,7 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
60
62
|
|
|
61
63
|
const renderDom: React.MutableRefObject<HTMLElement | null> = useRef(null);
|
|
62
64
|
const providerInfoRef = useRef<any>(null);
|
|
63
|
-
|
|
64
|
-
LoggerInstance.log(`RemoteAppWrapper hostInstance >>>`, hostInstance);
|
|
65
|
+
LoggerInstance.log(`RemoteAppWrapper instance from props >>>`, instance);
|
|
65
66
|
|
|
66
67
|
useEffect(() => {
|
|
67
68
|
const renderTimeout = setTimeout(() => {
|
|
@@ -84,18 +85,16 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
84
85
|
|
|
85
86
|
LoggerInstance.log(
|
|
86
87
|
`createRemoteComponent LazyComponent hostInstance >>>`,
|
|
87
|
-
|
|
88
|
+
instance,
|
|
88
89
|
);
|
|
89
90
|
const beforeBridgeRenderRes =
|
|
90
|
-
|
|
91
|
+
instance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(
|
|
91
92
|
renderProps,
|
|
92
93
|
) || {};
|
|
93
94
|
// @ts-ignore
|
|
94
95
|
renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
|
|
95
96
|
providerReturn.render(renderProps);
|
|
96
|
-
|
|
97
|
-
renderProps,
|
|
98
|
-
);
|
|
97
|
+
instance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(renderProps);
|
|
99
98
|
});
|
|
100
99
|
|
|
101
100
|
return () => {
|
|
@@ -107,7 +106,7 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
107
106
|
{ moduleName, basename, dom: renderDom.current },
|
|
108
107
|
);
|
|
109
108
|
|
|
110
|
-
|
|
109
|
+
instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit({
|
|
111
110
|
moduleName,
|
|
112
111
|
dom: renderDom.current,
|
|
113
112
|
basename,
|
|
@@ -121,7 +120,7 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
121
120
|
dom: renderDom.current,
|
|
122
121
|
});
|
|
123
122
|
|
|
124
|
-
|
|
123
|
+
instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit({
|
|
125
124
|
moduleName,
|
|
126
125
|
dom: renderDom.current,
|
|
127
126
|
basename,
|
package/src/router-v5.tsx
CHANGED
|
@@ -36,7 +36,7 @@ function WraperRouter(
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// @ts-ignore
|
|
39
|
-
//
|
|
39
|
+
// because export directly from react-router-dom/index.js will cause build falied.
|
|
40
40
|
// it will be replace by react-router-dom/index.js in building phase
|
|
41
41
|
export * from 'react-router-dom/';
|
|
42
42
|
|
package/src/router-v6.tsx
CHANGED
|
@@ -69,6 +69,7 @@ function WraperRouterProvider(
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
export * from 'react-router-dom/dist/index.js';
|
|
72
|
+
// export * from 'react-router-dom/dist/index.js';
|
|
73
|
+
export * from 'react-router-dom/';
|
|
73
74
|
export { WraperRouter as BrowserRouter };
|
|
74
75
|
export { WraperRouterProvider as RouterProvider };
|
package/src/utils.ts
CHANGED
package/vite.config.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineConfig } from 'vite';
|
|
2
|
-
import vue from '@vitejs/plugin-vue';
|
|
2
|
+
// import vue from '@vitejs/plugin-vue';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import dts from 'vite-plugin-dts';
|
|
5
|
-
import react from '@vitejs/plugin-react';
|
|
5
|
+
// import react from '@vitejs/plugin-react';
|
|
6
6
|
import packageJson from './package.json';
|
|
7
7
|
|
|
8
8
|
const perDepsKeys = Object.keys(packageJson.peerDependencies);
|
|
@@ -21,12 +21,14 @@ export default defineConfig({
|
|
|
21
21
|
lib: {
|
|
22
22
|
entry: {
|
|
23
23
|
index: path.resolve(__dirname, 'src/index.ts'),
|
|
24
|
+
plugin: path.resolve(__dirname, 'src/plugin.ts'),
|
|
24
25
|
router: path.resolve(__dirname, 'src/router.tsx'),
|
|
25
26
|
'router-v5': path.resolve(__dirname, 'src/router-v5.tsx'),
|
|
26
27
|
'router-v6': path.resolve(__dirname, 'src/router-v6.tsx'),
|
|
27
28
|
},
|
|
28
29
|
formats: ['cjs', 'es'],
|
|
29
|
-
fileName: (format, entryName) =>
|
|
30
|
+
fileName: (format, entryName) =>
|
|
31
|
+
`${entryName}.${format.replace('cjs', '')}.js`,
|
|
30
32
|
},
|
|
31
33
|
rollupOptions: {
|
|
32
34
|
external: [
|
|
@@ -36,7 +38,6 @@ export default defineConfig({
|
|
|
36
38
|
'react-router-dom/',
|
|
37
39
|
'react-router-dom/index.js',
|
|
38
40
|
'react-router-dom/dist/index.js',
|
|
39
|
-
'@module-federation/runtime',
|
|
40
41
|
],
|
|
41
42
|
plugins: [
|
|
42
43
|
{
|
|
@@ -44,13 +45,13 @@ export default defineConfig({
|
|
|
44
45
|
generateBundle(options, bundle) {
|
|
45
46
|
for (const fileName in bundle) {
|
|
46
47
|
const chunk = bundle[fileName];
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
if (fileName.includes('router-v6') && chunk.type === 'chunk') {
|
|
49
|
+
chunk.code = chunk.code.replace(
|
|
50
|
+
// Match 'react-router-dom/' followed by single quotes, double quotes, or backticks, replacing only 'react-router-dom/' to react-router-v6 dist file structure
|
|
51
|
+
/react-router-dom\/(?=[\'\"\`])/g,
|
|
52
|
+
'react-router-dom/dist/index.js',
|
|
53
|
+
);
|
|
54
|
+
}
|
|
54
55
|
|
|
55
56
|
if (fileName.includes('router-v5') && chunk.type === 'chunk') {
|
|
56
57
|
chunk.code = chunk.code.replace(
|
|
File without changes
|
|
File without changes
|