@tramvai/module-child-app 5.50.0 → 5.53.78
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/lib/browser/loader.browser.js +18 -5
- package/lib/browser/loader.d.ts +10 -2
- package/lib/browser/preload.browser.js +85 -29
- package/lib/browser/preload.d.ts +14 -2
- package/lib/browser/providers.browser.js +17 -2
- package/lib/browser/render.browser.js +15 -1
- package/lib/browser/render.d.ts +10 -2
- package/lib/browser/runCommand.browser.js +1 -1
- package/lib/browser/runCommand.d.ts +1 -1
- package/lib/browser/timing.browser.js +100 -0
- package/lib/browser/timing.d.ts +4 -0
- package/lib/browser.js +2 -1
- package/lib/contracts/contractManager.base.browser.js +4 -0
- package/lib/contracts/contractManager.base.es.js +4 -0
- package/lib/contracts/contractManager.base.js +4 -0
- package/lib/contracts/contractManager.server.es.js +1 -0
- package/lib/contracts/contractManager.server.js +1 -0
- package/lib/server/loader.d.ts +15 -6
- package/lib/server/loader.es.js +63 -13
- package/lib/server/loader.js +63 -13
- package/lib/server/module-federation/best-loaded-shared-modules.d.ts +15 -0
- package/lib/server/module-federation/best-loaded-shared-modules.es.js +26 -0
- package/lib/server/module-federation/best-loaded-shared-modules.js +30 -0
- package/lib/server/module-federation/best-shared-modules.d.ts +15 -0
- package/lib/server/module-federation/utils.d.ts +18 -0
- package/lib/server/module-federation/utils.es.js +38 -0
- package/lib/server/module-federation/utils.js +43 -0
- package/lib/server/preload.d.ts +13 -2
- package/lib/server/preload.es.js +58 -19
- package/lib/server/preload.js +58 -19
- package/lib/server/providers.es.js +16 -3
- package/lib/server/providers.js +13 -0
- package/lib/server/render-slots.es.js +62 -50
- package/lib/server/render-slots.js +62 -50
- package/lib/server/render.d.ts +9 -2
- package/lib/server/render.es.js +13 -2
- package/lib/server/render.js +13 -2
- package/lib/server/stateManager.es.js +3 -1
- package/lib/server/stateManager.js +3 -1
- package/lib/shared/command.browser.js +4 -0
- package/lib/shared/command.es.js +4 -0
- package/lib/shared/command.js +4 -0
- package/lib/shared/di.browser.js +5 -1
- package/lib/shared/di.es.js +5 -1
- package/lib/shared/di.js +5 -1
- package/lib/shared/pageService.browser.js +8 -3
- package/lib/shared/pageService.es.js +8 -3
- package/lib/shared/pageService.js +8 -3
- package/lib/shared/providers.browser.js +8 -3
- package/lib/shared/providers.es.js +8 -3
- package/lib/shared/providers.js +6 -1
- package/lib/shared/react/ChildAppErrorBoundary/ChildAppErrorBoundary.browser.js +56 -0
- package/lib/shared/react/ChildAppErrorBoundary/ChildAppErrorBoundary.d.ts +45 -0
- package/lib/shared/react/ChildAppErrorBoundary/ChildAppErrorBoundary.es.js +56 -0
- package/lib/shared/react/ChildAppErrorBoundary/ChildAppErrorBoundary.js +60 -0
- package/lib/shared/react/ChildAppErrorBoundary/FallbackError.browser.js +21 -0
- package/lib/shared/react/ChildAppErrorBoundary/FallbackError.d.ts +5 -0
- package/lib/shared/react/ChildAppErrorBoundary/FallbackError.es.js +21 -0
- package/lib/shared/react/ChildAppErrorBoundary/FallbackError.js +25 -0
- package/lib/shared/react/ChildAppFallbackWrapper.browser.js +14 -0
- package/lib/shared/react/ChildAppFallbackWrapper.d.ts +10 -0
- package/lib/shared/react/ChildAppFallbackWrapper.es.js +14 -0
- package/lib/shared/react/ChildAppFallbackWrapper.js +18 -0
- package/lib/shared/react/childAppErrorBoundaryWrapper.browser.js +22 -0
- package/lib/shared/react/childAppErrorBoundaryWrapper.d.ts +8 -0
- package/lib/shared/react/childAppErrorBoundaryWrapper.es.js +22 -0
- package/lib/shared/react/childAppErrorBoundaryWrapper.js +26 -0
- package/lib/shared/react/component.browser.js +31 -6
- package/lib/shared/react/component.es.js +31 -6
- package/lib/shared/react/component.js +29 -4
- package/lib/shared/resolutionConfigManager.browser.js +35 -15
- package/lib/shared/resolutionConfigManager.d.ts +8 -2
- package/lib/shared/resolutionConfigManager.es.js +35 -15
- package/lib/shared/resolutionConfigManager.js +35 -15
- package/lib/shared/singletonDi.browser.js +18 -2
- package/lib/shared/singletonDi.d.ts +1 -0
- package/lib/shared/singletonDi.es.js +18 -2
- package/lib/shared/singletonDi.js +18 -2
- package/lib/shared/store.browser.js +15 -2
- package/lib/shared/store.d.ts +6 -0
- package/lib/shared/store.es.js +15 -2
- package/lib/shared/store.js +15 -1
- package/lib/shared/webpack/moduleFederation.browser.js +42 -0
- package/lib/shared/webpack/moduleFederation.d.ts +27 -18
- package/lib/shared/webpack/moduleFederation.es.js +42 -0
- package/lib/shared/webpack/moduleFederation.js +42 -0
- package/package.json +16 -16
- package/lib/shared/react/childAppErrorBoundary.browser.js +0 -14
- package/lib/shared/react/childAppErrorBoundary.d.ts +0 -8
- package/lib/shared/react/childAppErrorBoundary.es.js +0 -14
- package/lib/shared/react/childAppErrorBoundary.js +0 -18
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
declare global {
|
|
2
2
|
var __webpack_init_sharing__: (name: string) => Promise<void>;
|
|
3
3
|
var __webpack_share_scopes__: ModuleFederationSharedScopes;
|
|
4
|
+
var __webpack_share_preloaded__: {
|
|
5
|
+
containerName: string;
|
|
6
|
+
shareKey: string;
|
|
7
|
+
version: string;
|
|
8
|
+
childAppName: string;
|
|
9
|
+
childAppVersion: string;
|
|
10
|
+
}[];
|
|
4
11
|
var __remote_scope__: {
|
|
5
12
|
_config: Record<string, string>;
|
|
6
13
|
};
|
|
7
14
|
}
|
|
8
|
-
interface
|
|
15
|
+
export interface ModuleFederationSharedScopeItem {
|
|
16
|
+
get: Function;
|
|
17
|
+
from: string;
|
|
18
|
+
eager: boolean;
|
|
19
|
+
loaded: 0 | 1 | boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ModuleFederationSharedScope {
|
|
9
22
|
[packageName: string]: {
|
|
10
|
-
[version: string]:
|
|
11
|
-
get: Function;
|
|
12
|
-
from: string;
|
|
13
|
-
eager: boolean;
|
|
14
|
-
loaded: 0 | 1 | boolean;
|
|
15
|
-
};
|
|
23
|
+
[version: string]: ModuleFederationSharedScopeItem;
|
|
16
24
|
};
|
|
17
25
|
}
|
|
18
26
|
interface ModuleFederationSharedScopes {
|
|
@@ -23,22 +31,23 @@ export interface ModuleFederationContainer {
|
|
|
23
31
|
init(scope: ModuleFederationSharedScopes[string]): Promise<void>;
|
|
24
32
|
get<T = unknown>(name: string): Promise<T>;
|
|
25
33
|
}
|
|
34
|
+
export interface ModuleFederationSharedModule {
|
|
35
|
+
chunks: string[];
|
|
36
|
+
provides: Array<{
|
|
37
|
+
shareScope: string;
|
|
38
|
+
shareKey: string;
|
|
39
|
+
requiredVersion: string;
|
|
40
|
+
strictVersion: boolean;
|
|
41
|
+
singleton: boolean;
|
|
42
|
+
eager: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
26
45
|
export interface ModuleFederationStats {
|
|
27
46
|
sharedModules: any[];
|
|
28
47
|
federatedModules: Array<{
|
|
29
48
|
remote: string;
|
|
30
49
|
entry: string;
|
|
31
|
-
sharedModules: Array<
|
|
32
|
-
chunks: string[];
|
|
33
|
-
provides: Array<{
|
|
34
|
-
shareScope: string;
|
|
35
|
-
shareKey: string;
|
|
36
|
-
requiredVersion: string;
|
|
37
|
-
strictVersion: boolean;
|
|
38
|
-
singleton: boolean;
|
|
39
|
-
eager: boolean;
|
|
40
|
-
}>;
|
|
41
|
-
}>;
|
|
50
|
+
sharedModules: Array<ModuleFederationSharedModule>;
|
|
42
51
|
exposes: Record<string, Array<Record<string, string[]>>>;
|
|
43
52
|
}>;
|
|
44
53
|
}
|
|
@@ -11,6 +11,48 @@ const initModuleFederation = async (container, scope = 'default') => {
|
|
|
11
11
|
// to implement the same logic for loading child-app as UniversalModuleFederation
|
|
12
12
|
global.__remote_scope__ = global.__remote_scope__ || { _config: {} };
|
|
13
13
|
}
|
|
14
|
+
else {
|
|
15
|
+
// for easy debugging
|
|
16
|
+
if (process.env.NODE_ENV === 'development') {
|
|
17
|
+
window.__webpack_share_scopes__ = __webpack_share_scopes__;
|
|
18
|
+
}
|
|
19
|
+
// iterate over server-side preloaded shared modules
|
|
20
|
+
window.__webpack_share_preloaded__?.forEach((preloaded) => {
|
|
21
|
+
// Child Apps entries will register itself in the global scope with unique name after loading
|
|
22
|
+
// @ts-expect-error
|
|
23
|
+
const containerForPreloaded = window[preloaded.containerName];
|
|
24
|
+
if (containerForPreloaded) {
|
|
25
|
+
// early init to register all container shared modules in share scope
|
|
26
|
+
containerForPreloaded.init(__webpack_share_scopes__[scope]);
|
|
27
|
+
//
|
|
28
|
+
// For example, at server-side we preload two Child Apps - "base" and "router",
|
|
29
|
+
// with the same shared dependency "@tramvai/core@3.4.5", and host has uncompatible "@tramvai/core@4.0.0".
|
|
30
|
+
//
|
|
31
|
+
// It means that MF can share any of shared "@tramvai/core@3.4.5" instance between this two Child Apps.
|
|
32
|
+
//
|
|
33
|
+
// But MF share scope is a singleton at server, and we can't predict which Child App will be loaded first,
|
|
34
|
+
// or "base" can be resolved first at different page, and which dependency will be registered at share scope.
|
|
35
|
+
//
|
|
36
|
+
// When we preload used at server-side shared dependency script to prevent client-side waterfalls,
|
|
37
|
+
// it can be "base/@tramvai/core@3.4.5.js" or "router/@tramvai/core@3.4.5.js"
|
|
38
|
+
//
|
|
39
|
+
// And here is the problem - client-side runtime logic will don't know which shared dependency was preloaded,
|
|
40
|
+
// because "loaded = 1" flag is set to 1 only when the module is required from Child App entry.
|
|
41
|
+
//
|
|
42
|
+
// Shared dependencies registration logic described here:
|
|
43
|
+
// https://github.com/webpack/webpack/blob/97d4961cd1de9c69dba0f050a63f3b56bb64fab2/lib/sharing/ShareRuntimeModule.js#L100
|
|
44
|
+
// For our example it means that "@tramvai/core" from "router" will have priority, because of names comparsion - "router" > "base",
|
|
45
|
+
// and "loaded" flag is absent.
|
|
46
|
+
//
|
|
47
|
+
// So, even if the "base/@tramvai/core@3.4.5.js" was preloaded on the server, an additional request for the "router/@tramvai/core@3.4.5.js" will occur on the client.
|
|
48
|
+
// To prevent this, manually mark "base/@tramvai/core@3.4.5.js" as loaded in share scope immediately after registration.
|
|
49
|
+
//
|
|
50
|
+
__webpack_share_scopes__[scope][preloaded.shareKey][preloaded.version].loaded = 1;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// cleanup
|
|
54
|
+
window.__webpack_share_preloaded__ = [];
|
|
55
|
+
}
|
|
14
56
|
await __webpack_init_sharing__('default');
|
|
15
57
|
// currently module federation has problems with external modules (they are marked as externals in the dev build)
|
|
16
58
|
// and unfortunately react and react-dom are marked as externals in defaults
|
|
@@ -15,6 +15,48 @@ const initModuleFederation = async (container, scope = 'default') => {
|
|
|
15
15
|
// to implement the same logic for loading child-app as UniversalModuleFederation
|
|
16
16
|
global.__remote_scope__ = global.__remote_scope__ || { _config: {} };
|
|
17
17
|
}
|
|
18
|
+
else {
|
|
19
|
+
// for easy debugging
|
|
20
|
+
if (process.env.NODE_ENV === 'development') {
|
|
21
|
+
window.__webpack_share_scopes__ = __webpack_share_scopes__;
|
|
22
|
+
}
|
|
23
|
+
// iterate over server-side preloaded shared modules
|
|
24
|
+
window.__webpack_share_preloaded__?.forEach((preloaded) => {
|
|
25
|
+
// Child Apps entries will register itself in the global scope with unique name after loading
|
|
26
|
+
// @ts-expect-error
|
|
27
|
+
const containerForPreloaded = window[preloaded.containerName];
|
|
28
|
+
if (containerForPreloaded) {
|
|
29
|
+
// early init to register all container shared modules in share scope
|
|
30
|
+
containerForPreloaded.init(__webpack_share_scopes__[scope]);
|
|
31
|
+
//
|
|
32
|
+
// For example, at server-side we preload two Child Apps - "base" and "router",
|
|
33
|
+
// with the same shared dependency "@tramvai/core@3.4.5", and host has uncompatible "@tramvai/core@4.0.0".
|
|
34
|
+
//
|
|
35
|
+
// It means that MF can share any of shared "@tramvai/core@3.4.5" instance between this two Child Apps.
|
|
36
|
+
//
|
|
37
|
+
// But MF share scope is a singleton at server, and we can't predict which Child App will be loaded first,
|
|
38
|
+
// or "base" can be resolved first at different page, and which dependency will be registered at share scope.
|
|
39
|
+
//
|
|
40
|
+
// When we preload used at server-side shared dependency script to prevent client-side waterfalls,
|
|
41
|
+
// it can be "base/@tramvai/core@3.4.5.js" or "router/@tramvai/core@3.4.5.js"
|
|
42
|
+
//
|
|
43
|
+
// And here is the problem - client-side runtime logic will don't know which shared dependency was preloaded,
|
|
44
|
+
// because "loaded = 1" flag is set to 1 only when the module is required from Child App entry.
|
|
45
|
+
//
|
|
46
|
+
// Shared dependencies registration logic described here:
|
|
47
|
+
// https://github.com/webpack/webpack/blob/97d4961cd1de9c69dba0f050a63f3b56bb64fab2/lib/sharing/ShareRuntimeModule.js#L100
|
|
48
|
+
// For our example it means that "@tramvai/core" from "router" will have priority, because of names comparsion - "router" > "base",
|
|
49
|
+
// and "loaded" flag is absent.
|
|
50
|
+
//
|
|
51
|
+
// So, even if the "base/@tramvai/core@3.4.5.js" was preloaded on the server, an additional request for the "router/@tramvai/core@3.4.5.js" will occur on the client.
|
|
52
|
+
// To prevent this, manually mark "base/@tramvai/core@3.4.5.js" as loaded in share scope immediately after registration.
|
|
53
|
+
//
|
|
54
|
+
__webpack_share_scopes__[scope][preloaded.shareKey][preloaded.version].loaded = 1;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// cleanup
|
|
58
|
+
window.__webpack_share_preloaded__ = [];
|
|
59
|
+
}
|
|
18
60
|
await __webpack_init_sharing__('default');
|
|
19
61
|
// currently module federation has problems with external modules (they are marked as externals in the dev build)
|
|
20
62
|
// and unfortunately react and react-dom are marked as externals in defaults
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tramvai/module-child-app",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.53.78",
|
|
4
4
|
"description": "Module for child apps",
|
|
5
5
|
"browser": {
|
|
6
6
|
"./lib/server.es.js": "./lib/browser.js",
|
|
@@ -31,25 +31,25 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@loadable/server": "^5.15.0",
|
|
33
33
|
"@tinkoff/env-validators": "0.4.2",
|
|
34
|
-
"@tinkoff/errors": "0.6.
|
|
35
|
-
"@tinkoff/module-loader-client": "0.7.
|
|
36
|
-
"@tinkoff/module-loader-server": "0.8.
|
|
37
|
-
"@tinkoff/url": "0.11.
|
|
38
|
-
"@tramvai/child-app-core": "5.
|
|
39
|
-
"@tramvai/module-common": "5.
|
|
34
|
+
"@tinkoff/errors": "0.6.3",
|
|
35
|
+
"@tinkoff/module-loader-client": "0.7.5",
|
|
36
|
+
"@tinkoff/module-loader-server": "0.8.8",
|
|
37
|
+
"@tinkoff/url": "0.11.3",
|
|
38
|
+
"@tramvai/child-app-core": "5.53.78",
|
|
39
|
+
"@tramvai/module-common": "5.53.78",
|
|
40
40
|
"@tramvai/safe-strings": "0.8.4",
|
|
41
|
-
"@tramvai/tokens-child-app": "5.
|
|
41
|
+
"@tramvai/tokens-child-app": "5.53.78"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@tinkoff/dippy": "0.11.
|
|
45
|
-
"@tinkoff/router": "0.5.
|
|
44
|
+
"@tinkoff/dippy": "0.11.5",
|
|
45
|
+
"@tinkoff/router": "0.5.202",
|
|
46
46
|
"@tinkoff/utils": "^2.1.2",
|
|
47
|
-
"@tramvai/core": "5.
|
|
48
|
-
"@tramvai/react": "5.
|
|
49
|
-
"@tramvai/state": "5.
|
|
50
|
-
"@tramvai/tokens-common": "5.
|
|
51
|
-
"@tramvai/tokens-render": "5.
|
|
52
|
-
"@tramvai/tokens-router": "5.
|
|
47
|
+
"@tramvai/core": "5.53.78",
|
|
48
|
+
"@tramvai/react": "5.53.78",
|
|
49
|
+
"@tramvai/state": "5.53.78",
|
|
50
|
+
"@tramvai/tokens-common": "5.53.78",
|
|
51
|
+
"@tramvai/tokens-render": "5.53.78",
|
|
52
|
+
"@tramvai/tokens-router": "5.53.78",
|
|
53
53
|
"object-assign": "^4.1.1",
|
|
54
54
|
"react": ">=16.14.0",
|
|
55
55
|
"react-dom": ">=16.14.0",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useMemo } from 'react';
|
|
3
|
-
import { CHILD_APP_ERROR_BOUNDARY_TOKEN } from '@tramvai/tokens-child-app';
|
|
4
|
-
import { useDi, UniversalErrorBoundary } from '@tramvai/react';
|
|
5
|
-
|
|
6
|
-
const ChildAppErrorBoundary = (props) => {
|
|
7
|
-
const { children, config } = props;
|
|
8
|
-
const { fallback, name, version, tag } = config;
|
|
9
|
-
const errorHandlers = useDi({ token: CHILD_APP_ERROR_BOUNDARY_TOKEN, optional: true });
|
|
10
|
-
const decoratedErrorHandlers = useMemo(() => errorHandlers?.map((errorHandler) => (error, info) => errorHandler(error, info, { name, version, tag })), [errorHandlers, name, version, tag]);
|
|
11
|
-
return (jsx(UniversalErrorBoundary, { fallback: fallback, errorHandlers: decoratedErrorHandlers, children: children }));
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export { ChildAppErrorBoundary };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { PropsWithChildren } from 'react';
|
|
2
|
-
import type { ChildAppReactConfig } from '@tramvai/tokens-child-app';
|
|
3
|
-
type Props = {
|
|
4
|
-
config: ChildAppReactConfig;
|
|
5
|
-
};
|
|
6
|
-
export declare const ChildAppErrorBoundary: (props: PropsWithChildren<Props>) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=childAppErrorBoundary.d.ts.map
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useMemo } from 'react';
|
|
3
|
-
import { CHILD_APP_ERROR_BOUNDARY_TOKEN } from '@tramvai/tokens-child-app';
|
|
4
|
-
import { useDi, UniversalErrorBoundary } from '@tramvai/react';
|
|
5
|
-
|
|
6
|
-
const ChildAppErrorBoundary = (props) => {
|
|
7
|
-
const { children, config } = props;
|
|
8
|
-
const { fallback, name, version, tag } = config;
|
|
9
|
-
const errorHandlers = useDi({ token: CHILD_APP_ERROR_BOUNDARY_TOKEN, optional: true });
|
|
10
|
-
const decoratedErrorHandlers = useMemo(() => errorHandlers?.map((errorHandler) => (error, info) => errorHandler(error, info, { name, version, tag })), [errorHandlers, name, version, tag]);
|
|
11
|
-
return (jsx(UniversalErrorBoundary, { fallback: fallback, errorHandlers: decoratedErrorHandlers, children: children }));
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export { ChildAppErrorBoundary };
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
var react$1 = require('react');
|
|
7
|
-
var tokensChildApp = require('@tramvai/tokens-child-app');
|
|
8
|
-
var react = require('@tramvai/react');
|
|
9
|
-
|
|
10
|
-
const ChildAppErrorBoundary = (props) => {
|
|
11
|
-
const { children, config } = props;
|
|
12
|
-
const { fallback, name, version, tag } = config;
|
|
13
|
-
const errorHandlers = react.useDi({ token: tokensChildApp.CHILD_APP_ERROR_BOUNDARY_TOKEN, optional: true });
|
|
14
|
-
const decoratedErrorHandlers = react$1.useMemo(() => errorHandlers?.map((errorHandler) => (error, info) => errorHandler(error, info, { name, version, tag })), [errorHandlers, name, version, tag]);
|
|
15
|
-
return (jsxRuntime.jsx(react.UniversalErrorBoundary, { fallback: fallback, errorHandlers: decoratedErrorHandlers, children: children }));
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
exports.ChildAppErrorBoundary = ChildAppErrorBoundary;
|