@module-federation/node 0.13.1 → 0.14.1-beta.0
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 +50 -0
- package/package.json +4 -3
- package/src/utils/flush-chunks.d.ts +5 -1
- package/src/utils/flush-chunks.js +114 -72
- package/src/utils/flush-chunks.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [0.14.1-beta.0](https://github.com/module-federation/nextjs-mf/compare/node-0.14.0...node-0.14.1-beta.0) (2023-04-28)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* Improve module chunk connections ([#802](https://github.com/module-federation/nextjs-mf/issues/802)) ([ce0bd7b](https://github.com/module-federation/nextjs-mf/commit/ce0bd7b16e080f712e6db0bdcd3955a8167c274f)), closes [#803](https://github.com/module-federation/nextjs-mf/issues/803) [#808](https://github.com/module-federation/nextjs-mf/issues/808) [#811](https://github.com/module-federation/nextjs-mf/issues/811)
|
|
11
|
+
* release to npm with next tag to not ruine latest one ([#763](https://github.com/module-federation/nextjs-mf/issues/763)) ([f2d199b](https://github.com/module-federation/nextjs-mf/commit/f2d199b3b3fbbd428514b1ce1f139efc82f7fff0))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## [0.13.1](https://github.com/module-federation/nextjs-mf/compare/node-0.13.1-beta.0...node-0.13.1) (2023-04-19)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## [0.13.1-beta.0](https://github.com/module-federation/nextjs-mf/compare/node-0.13.0...node-0.13.1-beta.0) (2023-04-19)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* use container proxy on script VM instead of host resolver point ([2929d0f](https://github.com/module-federation/nextjs-mf/commit/2929d0f64d4b8edf268af5ca83f807a02b121861))
|
|
25
|
+
* get delegates working ([#527](https://github.com/module-federation/nextjs-mf/issues/527)) ([7655568](https://github.com/module-federation/nextjs-mf/commit/7655568fcef8dbfda40573deb5d3d029c101074c))
|
|
26
|
+
* improved asset pipeline ([63928b2](https://github.com/module-federation/nextjs-mf/commit/63928b28150c2c4e3adb9e14fb7aa54f5cf1578d))
|
|
27
|
+
* peer dependencies metadata ([d3a2ed0](https://github.com/module-federation/nextjs-mf/commit/d3a2ed0e378b59afdeb632d1e2e0290f05cbca19))
|
|
28
|
+
* solve externalization ([49f52e5](https://github.com/module-federation/nextjs-mf/commit/49f52e53ddddc990d31e6aa510d67dc0552a9d9a))
|
|
29
|
+
* use EntryPlugin for injection of remotes ([e522c5a](https://github.com/module-federation/nextjs-mf/commit/e522c5ad2b7adcbd6c39f9c5fdb7a3e418277b7a))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Features
|
|
33
|
+
|
|
34
|
+
* delegate module support ([5061d3d](https://github.com/module-federation/nextjs-mf/commit/5061d3d64d7d83dbb25b4ef2378d434545186cb1))
|
|
35
|
+
* chunk flushing in delegates ([5e2375f](https://github.com/module-federation/nextjs-mf/commit/5e2375f598437803105ac4bc2237f6b652554d00))
|
|
36
|
+
* delegate module support ([8dd154c](https://github.com/module-federation/nextjs-mf/commit/8dd154c261b34183b12250ce204904cd3e085658))
|
|
37
|
+
* delegate module support ([d242163](https://github.com/module-federation/nextjs-mf/commit/d24216324183bfec5c7ba672ba6da05679f67809))
|
|
38
|
+
* delegates part two ([1be2686](https://github.com/module-federation/nextjs-mf/commit/1be2686624798a7df9f447b48279294985b3f592))
|
|
39
|
+
* improve chunk correlation ([22d8afc](https://github.com/module-federation/nextjs-mf/commit/22d8afccff101044fcdeba390656950dbc6eafed))
|
|
40
|
+
* new chunk flushing system for exposed modules ([97a75d8](https://github.com/module-federation/nextjs-mf/commit/97a75d8702f2ddc5e12cff2ac4d24aca1df6f990))
|
|
41
|
+
* prepare for v7 ([7bc4b3b](https://github.com/module-federation/nextjs-mf/commit/7bc4b3bd44e0926a52d6a9cbe56f0c4d7bb700ae))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### BREAKING CHANGES
|
|
45
|
+
|
|
46
|
+
* safety breaking change note
|
|
47
|
+
BREAKING_CHANGE: safety breaking change note
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# [0.14.0](https://github.com/module-federation/nextjs-mf/compare/node-0.13.0...node-0.14.0) (2023-04-19)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
5
55
|
## [0.13.1](https://github.com/module-federation/nextjs-mf/compare/node-0.13.1-beta.0...node-0.13.1) (2023-04-19)
|
|
6
56
|
|
|
7
57
|
### Dependency Updates
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"public": true,
|
|
3
3
|
"name": "@module-federation/node",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.14.1-beta.0",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "src/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -33,8 +33,9 @@
|
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"encoding": "0.1.13",
|
|
36
|
-
"node-fetch": "2.6.
|
|
37
|
-
"@module-federation/utilities": "1.
|
|
36
|
+
"node-fetch": "2.6.9",
|
|
37
|
+
"@module-federation/utilities": "1.7.1",
|
|
38
|
+
"webpack-sources": "3.2.3"
|
|
38
39
|
},
|
|
39
40
|
"peerDependencies": {
|
|
40
41
|
"next": "^12||^13",
|
|
@@ -1,97 +1,139 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.flushChunks = exports.usedChunks = void 0;
|
|
4
|
+
/* eslint-disable no-undef */
|
|
5
|
+
/**
|
|
6
|
+
* Initialize usedChunks and share it globally.
|
|
7
|
+
* @type {Set}
|
|
8
|
+
*/
|
|
4
9
|
exports.usedChunks = global.usedChunks || new Set();
|
|
5
10
|
global.usedChunks = exports.usedChunks;
|
|
6
|
-
|
|
7
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Load hostStats from the JSON file.
|
|
13
|
+
* @returns {object} hostStats - An object containing host stats data.
|
|
14
|
+
*/
|
|
15
|
+
const loadHostStats = () => {
|
|
8
16
|
try {
|
|
9
|
-
|
|
17
|
+
return __non_webpack_require__('../federated-stats.json');
|
|
10
18
|
}
|
|
11
19
|
catch (e) {
|
|
20
|
+
return {};
|
|
12
21
|
}
|
|
13
|
-
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Create a shareMap based on the loaded modules.
|
|
25
|
+
* @returns {object} shareMap - An object containing the shareMap data.
|
|
26
|
+
*/
|
|
27
|
+
const createShareMap = () => {
|
|
28
|
+
// Check if __webpack_share_scopes__ is defined and has a default property
|
|
14
29
|
if (__webpack_share_scopes__?.default) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
// Reduce the keys of the default property to create the share map
|
|
31
|
+
return Object.keys(__webpack_share_scopes__.default).reduce((acc, key) => {
|
|
32
|
+
// Get the loaded modules for the current key
|
|
33
|
+
const loadedModules = Object.values(__webpack_share_scopes__.default[key])
|
|
34
|
+
// Filter out the modules that are not loaded
|
|
35
|
+
.filter((sharedModule) => sharedModule.loaded)
|
|
36
|
+
// Map the filtered modules to their 'from' properties
|
|
37
|
+
.map((sharedModule) => sharedModule.from);
|
|
38
|
+
// If there are any loaded modules, add them to the accumulator object
|
|
21
39
|
if (loadedModules.length > 0) {
|
|
22
40
|
acc[key] = loadedModules;
|
|
23
41
|
}
|
|
42
|
+
// Return the accumulator object for the next iteration
|
|
24
43
|
return acc;
|
|
25
44
|
}, {});
|
|
26
45
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
// If __webpack_share_scopes__ is not defined or doesn't have a default property, return an empty object
|
|
47
|
+
return {};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Process a single chunk and return an array of updated chunks.
|
|
51
|
+
* @param {string} chunk - A chunk string containing remote and request data.
|
|
52
|
+
* @param {object} shareMap - An object containing the shareMap data.
|
|
53
|
+
* @param {object} hostStats - An object containing host stats data.
|
|
54
|
+
* @returns {Promise<Array>} A promise that resolves to an array of updated chunks.
|
|
55
|
+
*/
|
|
56
|
+
const processChunk = async (chunk, shareMap, hostStats) => {
|
|
57
|
+
// Create a set to store the chunks
|
|
58
|
+
const chunks = new Set();
|
|
59
|
+
// Split the chunk string into remote and request
|
|
60
|
+
const [remote, request] = chunk.split('->');
|
|
61
|
+
// If the remote is not defined in the global config, return
|
|
62
|
+
if (!global.__remote_scope__._config[remote]) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
// Extract the remote name from the URL
|
|
67
|
+
const remoteName = new URL(global.__remote_scope__._config[remote]).pathname
|
|
68
|
+
.split('/')
|
|
69
|
+
.pop();
|
|
70
|
+
// Construct the stats file URL from the remote config
|
|
71
|
+
const statsFile = global.__remote_scope__._config[remote]
|
|
72
|
+
.replace(remoteName, 'federated-stats.json')
|
|
73
|
+
.replace('ssr', 'chunks');
|
|
74
|
+
let stats = {};
|
|
34
75
|
try {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
try {
|
|
39
|
-
await fetch(global.__remote_scope__._config[remote]);
|
|
40
|
-
stats = await fetch(statsFile).then((res) => res.json());
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
console.error("flush errer", e);
|
|
44
|
-
}
|
|
45
|
-
chunks.add(global.__remote_scope__._config[remote].replace('ssr', 'chunks'));
|
|
46
|
-
const [prefix] = global.__remote_scope__._config[remote].split('static/');
|
|
47
|
-
if (stats.federatedModules) {
|
|
48
|
-
// console.log(shareMap)
|
|
49
|
-
stats.federatedModules.forEach((modules) => {
|
|
50
|
-
if (modules.exposes?.[request]) {
|
|
51
|
-
modules.exposes[request].forEach((chunk) => {
|
|
52
|
-
Object.values(chunk).forEach((chunk) => {
|
|
53
|
-
if (chunk.files)
|
|
54
|
-
chunk.files.forEach((file) => {
|
|
55
|
-
console.log('adding', prefix + file);
|
|
56
|
-
chunks.add(prefix + file);
|
|
57
|
-
});
|
|
58
|
-
if (chunk.requiredModules) {
|
|
59
|
-
console.log('chunk.requiredModules', request, chunk.requiredModules);
|
|
60
|
-
chunk.requiredModules.forEach((module) => {
|
|
61
|
-
console.log('shareMap[module]', module, shareMap[module]);
|
|
62
|
-
if (shareMap[module]) {
|
|
63
|
-
if (shareMap[module][0].startsWith('host__')) {
|
|
64
|
-
console.log('host', hostStats);
|
|
65
|
-
}
|
|
66
|
-
console.log('shareMap[module]', module, shareMap[module]);
|
|
67
|
-
// shareMap[module].forEach((file) => {
|
|
68
|
-
// chunks.add(prefix + file)
|
|
69
|
-
// })
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
// todo: come back to this later
|
|
77
|
-
// if(modules.sharedModules?.[0]) {
|
|
78
|
-
// const sharedModules = modules.sharedModules.find((sharedModule) => {
|
|
79
|
-
// return sharedModule.provides.find((provide) => {return provide.shareKey === request})
|
|
80
|
-
// });
|
|
81
|
-
// sharedModules.chunks.forEach((chunk) => {
|
|
82
|
-
// chunks.add(prefix + chunk);
|
|
83
|
-
// });
|
|
84
|
-
// }
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
return Array.from(chunks);
|
|
76
|
+
// Fetch the remote config and stats file
|
|
77
|
+
await fetch(global.__remote_scope__._config[remote]);
|
|
78
|
+
stats = await fetch(statsFile).then((res) => res.json());
|
|
88
79
|
}
|
|
89
80
|
catch (e) {
|
|
90
|
-
console.
|
|
81
|
+
console.error('flush error', e);
|
|
82
|
+
}
|
|
83
|
+
// Add the main chunk to the chunks set
|
|
84
|
+
chunks.add(global.__remote_scope__._config[remote].replace('ssr', 'chunks'));
|
|
85
|
+
// Extract the prefix from the remote config
|
|
86
|
+
const [prefix] = global.__remote_scope__._config[remote].split('static/');
|
|
87
|
+
// Process federated modules from the stats object
|
|
88
|
+
if (stats.federatedModules) {
|
|
89
|
+
stats.federatedModules.forEach((modules) => {
|
|
90
|
+
// Process exposed modules
|
|
91
|
+
if (modules.exposes?.[request]) {
|
|
92
|
+
modules.exposes[request].forEach((chunk) => {
|
|
93
|
+
Object.values(chunk).forEach((chunk) => {
|
|
94
|
+
// Add files to the chunks set
|
|
95
|
+
if (chunk.files) {
|
|
96
|
+
chunk.files.forEach((file) => {
|
|
97
|
+
chunks.add(prefix + file);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Process required modules
|
|
101
|
+
if (chunk.requiredModules) {
|
|
102
|
+
chunk.requiredModules.forEach((module) => {
|
|
103
|
+
// Check if the module is in the shareMap
|
|
104
|
+
if (shareMap[module]) {
|
|
105
|
+
// If the module is from the host, log the host stats
|
|
106
|
+
if (shareMap[module][0].startsWith('host__')) {
|
|
107
|
+
console.log('host', hostStats);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
91
116
|
}
|
|
92
|
-
|
|
117
|
+
// Return the array of chunks
|
|
118
|
+
return Array.from(chunks);
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
console.log(e);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Flush the chunks and return a deduplicated array of chunks.
|
|
126
|
+
* @returns {Promise<Array>} A promise that resolves to an array of deduplicated chunks.
|
|
127
|
+
*/
|
|
128
|
+
const flushChunks = async () => {
|
|
129
|
+
const hostStats = loadHostStats();
|
|
130
|
+
const shareMap = createShareMap();
|
|
131
|
+
const allFlushed = await Promise.all(Array.from(exports.usedChunks).map(async (chunk) => processChunk(chunk, shareMap, hostStats)));
|
|
132
|
+
// Deduplicate the chunks array
|
|
93
133
|
const dedupe = Array.from(new Set([...allFlushed.flat()]));
|
|
134
|
+
// Clear usedChunks
|
|
94
135
|
exports.usedChunks.clear();
|
|
136
|
+
// Filter out any undefined or null values
|
|
95
137
|
return dedupe.filter(Boolean);
|
|
96
138
|
};
|
|
97
139
|
exports.flushChunks = flushChunks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flush-chunks.js","sourceRoot":"","sources":["../../../../../packages/node/src/utils/flush-chunks.js"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"flush-chunks.js","sourceRoot":"","sources":["../../../../../packages/node/src/utils/flush-chunks.js"],"names":[],"mappings":"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"}
|