@module-federation/modern-js 0.0.0-next-20250221063001 → 0.0.0-next-20250221090527
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/dist/cjs/cli/configPlugin.js +18 -42
- package/dist/cjs/cli/index.js +24 -30
- package/dist/cjs/cli/manifest.js +9 -10
- package/dist/cjs/cli/ssrPlugin.js +40 -40
- package/dist/cjs/cli/utils.js +27 -62
- package/dist/cjs/cli/utils.spec.js +0 -60
- package/dist/esm/cli/configPlugin.js +18 -45
- package/dist/esm/cli/index.js +28 -35
- package/dist/esm/cli/manifest.js +9 -10
- package/dist/esm/cli/ssrPlugin.js +40 -44
- package/dist/esm/cli/utils.js +27 -60
- package/dist/esm/cli/utils.spec.js +1 -78
- package/dist/esm-node/cli/configPlugin.js +18 -41
- package/dist/esm-node/cli/index.js +24 -30
- package/dist/esm-node/cli/manifest.js +9 -10
- package/dist/esm-node/cli/ssrPlugin.js +39 -40
- package/dist/esm-node/cli/utils.js +27 -61
- package/dist/esm-node/cli/utils.spec.js +1 -61
- package/dist/types/cli/configPlugin.d.ts +1 -11
- package/dist/types/cli/manifest.d.ts +1 -1
- package/dist/types/cli/ssrPlugin.d.ts +1 -0
- package/dist/types/cli/utils.d.ts +5 -6
- package/dist/types/types/index.d.ts +1 -1
- package/package.json +13 -13
|
@@ -6,17 +6,6 @@ function setEnv(enableSSR) {
|
|
|
6
6
|
process.env["MF_SSR_PRJ"] = "true";
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
function modifyBundlerConfig(options) {
|
|
10
|
-
const { mfConfig, config, isServer, modernjsConfig, remoteIpStrategy = "ipv4", bundlerType } = options;
|
|
11
|
-
patchMFConfig(mfConfig, isServer, remoteIpStrategy);
|
|
12
|
-
patchBundlerConfig({
|
|
13
|
-
bundlerType,
|
|
14
|
-
bundlerConfig: config,
|
|
15
|
-
isServer,
|
|
16
|
-
modernjsConfig,
|
|
17
|
-
mfConfig
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
9
|
const moduleFederationConfigPlugin = (userConfig) => ({
|
|
21
10
|
name: "@modern-js/plugin-module-federation-config",
|
|
22
11
|
pre: [
|
|
@@ -26,17 +15,33 @@ const moduleFederationConfigPlugin = (userConfig) => ({
|
|
|
26
15
|
"@modern-js/plugin-module-federation"
|
|
27
16
|
],
|
|
28
17
|
setup: async (api) => {
|
|
18
|
+
var _userConfig_userConfig, _modernjsConfig_server;
|
|
29
19
|
const modernjsConfig = api.getConfig();
|
|
30
20
|
const mfConfig = await getMFConfig(userConfig.originPluginOptions);
|
|
31
21
|
const csrConfig = userConfig.csrConfig || JSON.parse(JSON.stringify(mfConfig));
|
|
32
22
|
const ssrConfig = userConfig.ssrConfig || JSON.parse(JSON.stringify(mfConfig));
|
|
33
23
|
userConfig.ssrConfig = ssrConfig;
|
|
34
24
|
userConfig.csrConfig = csrConfig;
|
|
25
|
+
var _userConfig_userConfig_ssr;
|
|
26
|
+
const enableSSR = (_userConfig_userConfig_ssr = (_userConfig_userConfig = userConfig.userConfig) === null || _userConfig_userConfig === void 0 ? void 0 : _userConfig_userConfig.ssr) !== null && _userConfig_userConfig_ssr !== void 0 ? _userConfig_userConfig_ssr : Boolean(modernjsConfig === null || modernjsConfig === void 0 ? void 0 : (_modernjsConfig_server = modernjsConfig.server) === null || _modernjsConfig_server === void 0 ? void 0 : _modernjsConfig_server.ssr);
|
|
27
|
+
api.modifyBundlerChain((chain, { isProd, isServer }) => {
|
|
28
|
+
addMyTypes2Ignored(chain, isServer ? ssrConfig : csrConfig);
|
|
29
|
+
const targetMFConfig = isServer ? ssrConfig : csrConfig;
|
|
30
|
+
patchMFConfig(targetMFConfig, isServer, userConfig.remoteIpStrategy || "ipv4");
|
|
31
|
+
patchBundlerConfig({
|
|
32
|
+
// @ts-expect-error chain type is not correct
|
|
33
|
+
chain,
|
|
34
|
+
isServer,
|
|
35
|
+
modernjsConfig,
|
|
36
|
+
mfConfig,
|
|
37
|
+
enableSSR
|
|
38
|
+
});
|
|
39
|
+
userConfig.distOutputDir = chain.output.get("path") || path.resolve(process.cwd(), "dist");
|
|
40
|
+
});
|
|
35
41
|
api.config(() => {
|
|
36
|
-
var
|
|
42
|
+
var _modernjsConfig_source, _modernjsConfig_source1, _modernjsConfig_dev;
|
|
37
43
|
const bundlerType = api.getAppContext().bundlerType === "rspack" ? "rspack" : "webpack";
|
|
38
44
|
const ipv4 = getIPV4();
|
|
39
|
-
const enableSSR = ((_userConfig_userConfig = userConfig.userConfig) === null || _userConfig_userConfig === void 0 ? void 0 : _userConfig_userConfig.ssr) === false ? false : Boolean(modernjsConfig === null || modernjsConfig === void 0 ? void 0 : (_modernjsConfig_server = modernjsConfig.server) === null || _modernjsConfig_server === void 0 ? void 0 : _modernjsConfig_server.ssr);
|
|
40
45
|
if (userConfig.remoteIpStrategy === void 0) {
|
|
41
46
|
if (!enableSSR) {
|
|
42
47
|
userConfig.remoteIpStrategy = "inherit";
|
|
@@ -47,33 +52,6 @@ const moduleFederationConfigPlugin = (userConfig) => ({
|
|
|
47
52
|
var _modernjsConfig_source_enableAsyncEntry;
|
|
48
53
|
return {
|
|
49
54
|
tools: {
|
|
50
|
-
bundlerChain(chain, { isServer }) {
|
|
51
|
-
addMyTypes2Ignored(chain, isServer ? ssrConfig : csrConfig);
|
|
52
|
-
},
|
|
53
|
-
rspack(config, { isServer }) {
|
|
54
|
-
var _config_output;
|
|
55
|
-
modifyBundlerConfig({
|
|
56
|
-
bundlerType,
|
|
57
|
-
mfConfig: isServer ? ssrConfig : csrConfig,
|
|
58
|
-
config,
|
|
59
|
-
isServer,
|
|
60
|
-
modernjsConfig,
|
|
61
|
-
remoteIpStrategy: userConfig.remoteIpStrategy
|
|
62
|
-
});
|
|
63
|
-
userConfig.distOutputDir = ((_config_output = config.output) === null || _config_output === void 0 ? void 0 : _config_output.path) || path.resolve(process.cwd(), "dist");
|
|
64
|
-
},
|
|
65
|
-
webpack(config, { isServer }) {
|
|
66
|
-
var _config_output;
|
|
67
|
-
modifyBundlerConfig({
|
|
68
|
-
bundlerType,
|
|
69
|
-
mfConfig: isServer ? ssrConfig : csrConfig,
|
|
70
|
-
config,
|
|
71
|
-
isServer,
|
|
72
|
-
modernjsConfig,
|
|
73
|
-
remoteIpStrategy: userConfig.remoteIpStrategy
|
|
74
|
-
});
|
|
75
|
-
userConfig.distOutputDir = ((_config_output = config.output) === null || _config_output === void 0 ? void 0 : _config_output.path) || path.resolve(process.cwd(), "dist");
|
|
76
|
-
},
|
|
77
55
|
devServer: {
|
|
78
56
|
headers: {
|
|
79
57
|
"Access-Control-Allow-Origin": "*",
|
|
@@ -102,7 +80,6 @@ const moduleFederationConfigPlugin = (userConfig) => ({
|
|
|
102
80
|
var configPlugin_default = moduleFederationConfigPlugin;
|
|
103
81
|
export {
|
|
104
82
|
configPlugin_default as default,
|
|
105
|
-
modifyBundlerConfig,
|
|
106
83
|
moduleFederationConfigPlugin,
|
|
107
84
|
setEnv
|
|
108
85
|
};
|
|
@@ -17,37 +17,31 @@ const moduleFederationPlugin = (userConfig = {}) => {
|
|
|
17
17
|
name: "@modern-js/plugin-module-federation",
|
|
18
18
|
setup: async (api) => {
|
|
19
19
|
const modernjsConfig = api.getConfig();
|
|
20
|
-
api.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
eager: (module) => module && /\.federation/.test((module === null || module === void 0 ? void 0 : module.request) || ""),
|
|
44
|
-
excludeChunk: (chunk) => chunk.name === browserPluginOptions.name
|
|
45
|
-
};
|
|
46
|
-
(_config_plugins1 = config.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(new AsyncBoundaryPlugin(asyncBoundaryPluginOptions));
|
|
47
|
-
}
|
|
48
|
-
}
|
|
20
|
+
api.modifyBundlerChain((chain, { isServer }) => {
|
|
21
|
+
const bundlerType = api.getAppContext().bundlerType === "rspack" ? "rspack" : "webpack";
|
|
22
|
+
const browserPluginOptions = internalModernPluginOptions.csrConfig;
|
|
23
|
+
const MFPlugin = bundlerType === "webpack" ? WebpackModuleFederationPlugin : RspackModuleFederationPlugin;
|
|
24
|
+
if (!isServer) {
|
|
25
|
+
chain.plugin("plugin-module-federation").use(MFPlugin, [
|
|
26
|
+
browserPluginOptions
|
|
27
|
+
]).init((Plugin, args) => {
|
|
28
|
+
internalModernPluginOptions.browserPlugin = new Plugin(args[0]);
|
|
29
|
+
return internalModernPluginOptions.browserPlugin;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (bundlerType === "webpack") {
|
|
33
|
+
var _modernjsConfig_source;
|
|
34
|
+
const enableAsyncEntry = (_modernjsConfig_source = modernjsConfig.source) === null || _modernjsConfig_source === void 0 ? void 0 : _modernjsConfig_source.enableAsyncEntry;
|
|
35
|
+
if (!enableAsyncEntry && browserPluginOptions.async !== false) {
|
|
36
|
+
const asyncBoundaryPluginOptions = typeof browserPluginOptions.async === "object" ? browserPluginOptions.async : {
|
|
37
|
+
eager: (module) => module && /\.federation/.test((module === null || module === void 0 ? void 0 : module.request) || ""),
|
|
38
|
+
excludeChunk: (chunk) => chunk.name === browserPluginOptions.name
|
|
39
|
+
};
|
|
40
|
+
chain.plugin("async-boundary-plugin").use(AsyncBoundaryPlugin, [
|
|
41
|
+
asyncBoundaryPluginOptions
|
|
42
|
+
]);
|
|
49
43
|
}
|
|
50
|
-
}
|
|
44
|
+
}
|
|
51
45
|
});
|
|
52
46
|
},
|
|
53
47
|
usePlugins: [
|
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import { fs } from "@modern-js/utils";
|
|
3
|
-
|
|
4
|
-
function mergeStats(browserStats, nodeStats) {
|
|
3
|
+
function mergeStats(browserStats, nodeStats, ssrDir) {
|
|
5
4
|
const ssrRemoteEntry = nodeStats.metaData.remoteEntry;
|
|
6
|
-
ssrRemoteEntry.path =
|
|
5
|
+
ssrRemoteEntry.path = ssrDir;
|
|
7
6
|
browserStats.metaData.ssrRemoteEntry = ssrRemoteEntry;
|
|
8
7
|
return browserStats;
|
|
9
8
|
}
|
|
10
|
-
function mergeManifest(browserManifest, nodeManifest) {
|
|
9
|
+
function mergeManifest(browserManifest, nodeManifest, ssrDir) {
|
|
11
10
|
const ssrRemoteEntry = nodeManifest.metaData.remoteEntry;
|
|
12
|
-
ssrRemoteEntry.path =
|
|
11
|
+
ssrRemoteEntry.path = ssrDir;
|
|
13
12
|
browserManifest.metaData.ssrRemoteEntry = ssrRemoteEntry;
|
|
14
13
|
return browserManifest;
|
|
15
14
|
}
|
|
16
|
-
function mergeStatsAndManifest(nodePlugin, browserPlugin) {
|
|
15
|
+
function mergeStatsAndManifest(nodePlugin, browserPlugin, ssrDir) {
|
|
17
16
|
const nodeResourceInfo = nodePlugin.statsResourceInfo;
|
|
18
17
|
const browserResourceInfo = browserPlugin.statsResourceInfo;
|
|
19
18
|
if (!browserResourceInfo || !nodeResourceInfo || !browserResourceInfo.stats || !nodeResourceInfo.stats || !browserResourceInfo.manifest || !nodeResourceInfo.manifest) {
|
|
20
19
|
throw new Error("can not get browserResourceInfo or nodeResourceInfo");
|
|
21
20
|
}
|
|
22
|
-
const mergedStats = mergeStats(browserResourceInfo.stats.stats, nodeResourceInfo.stats.stats);
|
|
23
|
-
const mergedManifest = mergeManifest(browserResourceInfo.manifest.manifest, nodeResourceInfo.manifest.manifest);
|
|
21
|
+
const mergedStats = mergeStats(browserResourceInfo.stats.stats, nodeResourceInfo.stats.stats, ssrDir);
|
|
22
|
+
const mergedManifest = mergeManifest(browserResourceInfo.manifest.manifest, nodeResourceInfo.manifest.manifest, ssrDir);
|
|
24
23
|
return {
|
|
25
24
|
mergedStats,
|
|
26
25
|
mergedStatsFilePath: browserResourceInfo.stats.filename,
|
|
@@ -28,8 +27,8 @@ function mergeStatsAndManifest(nodePlugin, browserPlugin) {
|
|
|
28
27
|
mergedManifestFilePath: browserResourceInfo.manifest.filename
|
|
29
28
|
};
|
|
30
29
|
}
|
|
31
|
-
function updateStatsAndManifest(nodePlugin, browserPlugin, outputDir) {
|
|
32
|
-
const { mergedStats, mergedStatsFilePath, mergedManifest, mergedManifestFilePath } = mergeStatsAndManifest(nodePlugin, browserPlugin);
|
|
30
|
+
function updateStatsAndManifest(nodePlugin, browserPlugin, outputDir, ssrDir) {
|
|
31
|
+
const { mergedStats, mergedStatsFilePath, mergedManifest, mergedManifestFilePath } = mergeStatsAndManifest(nodePlugin, browserPlugin, ssrDir);
|
|
33
32
|
fs.writeFileSync(path.resolve(outputDir, mergedStatsFilePath), JSON.stringify(mergedStats, null, 2));
|
|
34
33
|
fs.writeFileSync(path.resolve(outputDir, mergedManifestFilePath), JSON.stringify(mergedManifest, null, 2));
|
|
35
34
|
}
|
|
@@ -5,11 +5,13 @@ import { ModuleFederationPlugin as RspackModuleFederationPlugin } from "@module-
|
|
|
5
5
|
import UniverseEntryChunkTrackerPlugin from "@module-federation/node/universe-entry-chunk-tracker-plugin";
|
|
6
6
|
import { updateStatsAndManifest } from "./manifest";
|
|
7
7
|
import { isDev } from "./constant";
|
|
8
|
+
import { MODERN_JS_SERVER_DIR } from "../constant";
|
|
8
9
|
import logger from "./logger";
|
|
9
10
|
function setEnv() {
|
|
10
11
|
process.env["MF_DISABLE_EMIT_STATS"] = "true";
|
|
11
12
|
process.env["MF_SSR_PRJ"] = "true";
|
|
12
13
|
}
|
|
14
|
+
const CHAIN_MF_PLUGIN_ID = "plugin-module-federation-server";
|
|
13
15
|
const moduleFederationSSRPlugin = (pluginOptions) => ({
|
|
14
16
|
name: "@modern-js/plugin-module-federation-ssr",
|
|
15
17
|
pre: [
|
|
@@ -19,7 +21,10 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
|
|
|
19
21
|
setup: async (api) => {
|
|
20
22
|
var _pluginOptions_userConfig, _modernjsConfig_server;
|
|
21
23
|
const modernjsConfig = api.getConfig();
|
|
22
|
-
|
|
24
|
+
var _pluginOptions_userConfig_ssr;
|
|
25
|
+
const enableSSR = (_pluginOptions_userConfig_ssr = (_pluginOptions_userConfig = pluginOptions.userConfig) === null || _pluginOptions_userConfig === void 0 ? void 0 : _pluginOptions_userConfig.ssr) !== null && _pluginOptions_userConfig_ssr !== void 0 ? _pluginOptions_userConfig_ssr : Boolean(modernjsConfig === null || modernjsConfig === void 0 ? void 0 : (_modernjsConfig_server = modernjsConfig.server) === null || _modernjsConfig_server === void 0 ? void 0 : _modernjsConfig_server.ssr);
|
|
26
|
+
let csrOutputPath = "";
|
|
27
|
+
let ssrOutputPath = "";
|
|
23
28
|
if (!enableSSR) {
|
|
24
29
|
return;
|
|
25
30
|
}
|
|
@@ -41,33 +46,39 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
|
|
|
41
46
|
plugins
|
|
42
47
|
};
|
|
43
48
|
});
|
|
49
|
+
api.modifyBundlerChain((chain, { isServer }) => {
|
|
50
|
+
const bundlerType = api.getAppContext().bundlerType === "rspack" ? "rspack" : "webpack";
|
|
51
|
+
const MFPlugin = bundlerType === "webpack" ? ModuleFederationPlugin : RspackModuleFederationPlugin;
|
|
52
|
+
if (isServer) {
|
|
53
|
+
if (!chain.plugins.has(CHAIN_MF_PLUGIN_ID)) {
|
|
54
|
+
chain.plugin(CHAIN_MF_PLUGIN_ID).use(MFPlugin, [
|
|
55
|
+
pluginOptions.ssrConfig
|
|
56
|
+
]).init((Plugin, args) => {
|
|
57
|
+
pluginOptions.nodePlugin = new Plugin(args[0]);
|
|
58
|
+
return pluginOptions.nodePlugin;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (isServer) {
|
|
63
|
+
chain.target("async-node");
|
|
64
|
+
if (isDev) {
|
|
65
|
+
chain.plugin("UniverseEntryChunkTrackerPlugin").use(UniverseEntryChunkTrackerPlugin);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (isDev && !isServer) {
|
|
69
|
+
chain.externals({
|
|
70
|
+
"@module-federation/node/utils": "NOT_USED_IN_BROWSER"
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (isServer) {
|
|
74
|
+
ssrOutputPath = chain.output.get("path") || path.resolve(process.cwd(), `dist/${MODERN_JS_SERVER_DIR}`);
|
|
75
|
+
} else {
|
|
76
|
+
csrOutputPath = chain.output.get("path") || path.resolve(process.cwd(), "dist");
|
|
77
|
+
}
|
|
78
|
+
});
|
|
44
79
|
api.config(() => {
|
|
45
80
|
return {
|
|
46
81
|
tools: {
|
|
47
|
-
rspack(config, { isServer }) {
|
|
48
|
-
if (isServer) {
|
|
49
|
-
if (!pluginOptions.nodePlugin) {
|
|
50
|
-
var _config_plugins;
|
|
51
|
-
pluginOptions.nodePlugin = new RspackModuleFederationPlugin(pluginOptions.ssrConfig);
|
|
52
|
-
(_config_plugins = config.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(pluginOptions.nodePlugin);
|
|
53
|
-
}
|
|
54
|
-
} else {
|
|
55
|
-
var _config_output;
|
|
56
|
-
pluginOptions.distOutputDir = pluginOptions.distOutputDir || ((_config_output = config.output) === null || _config_output === void 0 ? void 0 : _config_output.path) || path.resolve(process.cwd(), "dist");
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
webpack(config, { isServer }) {
|
|
60
|
-
if (isServer) {
|
|
61
|
-
if (!pluginOptions.nodePlugin) {
|
|
62
|
-
var _config_plugins;
|
|
63
|
-
pluginOptions.nodePlugin = new ModuleFederationPlugin(pluginOptions.ssrConfig);
|
|
64
|
-
(_config_plugins = config.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(pluginOptions.nodePlugin);
|
|
65
|
-
}
|
|
66
|
-
} else {
|
|
67
|
-
var _config_output;
|
|
68
|
-
pluginOptions.distOutputDir = pluginOptions.distOutputDir || ((_config_output = config.output) === null || _config_output === void 0 ? void 0 : _config_output.path) || path.resolve(process.cwd(), "dist");
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
82
|
devServer: {
|
|
72
83
|
before: [
|
|
73
84
|
(req, res, next) => {
|
|
@@ -93,35 +104,23 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
|
|
|
93
104
|
}
|
|
94
105
|
}
|
|
95
106
|
]
|
|
96
|
-
},
|
|
97
|
-
bundlerChain(chain, { isServer }) {
|
|
98
|
-
if (isServer) {
|
|
99
|
-
chain.target("async-node");
|
|
100
|
-
if (isDev) {
|
|
101
|
-
chain.plugin("UniverseEntryChunkTrackerPlugin").use(UniverseEntryChunkTrackerPlugin);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (isDev && !isServer) {
|
|
105
|
-
chain.externals({
|
|
106
|
-
"@module-federation/node/utils": "NOT_USED_IN_BROWSER"
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
107
|
}
|
|
110
108
|
}
|
|
111
109
|
};
|
|
112
110
|
});
|
|
113
111
|
api.onAfterBuild(() => {
|
|
114
112
|
const { nodePlugin, browserPlugin, distOutputDir } = pluginOptions;
|
|
115
|
-
updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir);
|
|
113
|
+
updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir, path.relative(csrOutputPath, ssrOutputPath));
|
|
116
114
|
});
|
|
117
115
|
api.onDevCompileDone(() => {
|
|
118
116
|
const { nodePlugin, browserPlugin, distOutputDir } = pluginOptions;
|
|
119
|
-
updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir);
|
|
117
|
+
updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir, path.relative(csrOutputPath, ssrOutputPath));
|
|
120
118
|
});
|
|
121
119
|
}
|
|
122
120
|
});
|
|
123
121
|
var ssrPlugin_default = moduleFederationSSRPlugin;
|
|
124
122
|
export {
|
|
123
|
+
CHAIN_MF_PLUGIN_ID,
|
|
125
124
|
ssrPlugin_default as default,
|
|
126
125
|
moduleFederationSSRPlugin,
|
|
127
126
|
setEnv
|
|
@@ -135,19 +135,20 @@ const patchMFConfig = (mfConfig, isServer, remoteIpStrategy) => {
|
|
|
135
135
|
mfConfig.dev = false;
|
|
136
136
|
return mfConfig;
|
|
137
137
|
};
|
|
138
|
-
function patchIgnoreWarning(
|
|
139
|
-
|
|
138
|
+
function patchIgnoreWarning(chain) {
|
|
139
|
+
const ignoreWarnings = chain.get("ignoreWarnings") || [];
|
|
140
140
|
const ignoredMsgs = [
|
|
141
141
|
"external script",
|
|
142
142
|
"process.env.WS_NO_BUFFER_UTIL",
|
|
143
143
|
`Can't resolve 'utf-8-validate`
|
|
144
144
|
];
|
|
145
|
-
|
|
145
|
+
ignoreWarnings.push((warning) => {
|
|
146
146
|
if (ignoredMsgs.some((msg) => warning.message.includes(msg))) {
|
|
147
147
|
return true;
|
|
148
148
|
}
|
|
149
149
|
return false;
|
|
150
150
|
});
|
|
151
|
+
chain.ignoreWarnings(ignoreWarnings);
|
|
151
152
|
}
|
|
152
153
|
function addMyTypes2Ignored(chain, mfConfig) {
|
|
153
154
|
const watchOptions = chain.get("watchOptions");
|
|
@@ -186,55 +187,43 @@ function addMyTypes2Ignored(chain, mfConfig) {
|
|
|
186
187
|
});
|
|
187
188
|
}
|
|
188
189
|
function patchBundlerConfig(options) {
|
|
189
|
-
var
|
|
190
|
-
const {
|
|
191
|
-
|
|
192
|
-
(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
if (!((_bundlerConfig_output2 = bundlerConfig.output) === null || _bundlerConfig_output2 === void 0 ? void 0 : _bundlerConfig_output2.uniqueName)) {
|
|
200
|
-
bundlerConfig.output.uniqueName = mfConfig.name;
|
|
201
|
-
}
|
|
190
|
+
var _modernjsConfig_deploy;
|
|
191
|
+
const { chain, modernjsConfig, isServer, mfConfig, enableSSR } = options;
|
|
192
|
+
chain.optimization.delete("runtimeChunk");
|
|
193
|
+
patchIgnoreWarning(chain);
|
|
194
|
+
if (!chain.output.get("chunkLoadingGlobal")) {
|
|
195
|
+
chain.output.chunkLoadingGlobal(`chunk_${mfConfig.name}`);
|
|
196
|
+
}
|
|
197
|
+
if (!chain.output.get("uniqueName")) {
|
|
198
|
+
chain.output.uniqueName(mfConfig.name);
|
|
202
199
|
}
|
|
200
|
+
const splitChunkConfig = chain.optimization.splitChunks.entries();
|
|
203
201
|
if (!isServer) {
|
|
204
|
-
autoDeleteSplitChunkCacheGroups(mfConfig,
|
|
202
|
+
autoDeleteSplitChunkCacheGroups(mfConfig, splitChunkConfig);
|
|
205
203
|
}
|
|
206
|
-
if (!isServer && enableSSR &&
|
|
207
|
-
|
|
204
|
+
if (!isServer && enableSSR && splitChunkConfig && typeof splitChunkConfig === "object" && splitChunkConfig.cacheGroups) {
|
|
205
|
+
splitChunkConfig.chunks = "async";
|
|
208
206
|
logger.warn(`splitChunks.chunks = async is not allowed with stream SSR mode, it will auto changed to "async"`);
|
|
209
207
|
}
|
|
210
|
-
if (isDev &&
|
|
211
|
-
var _modernjsConfig_dev,
|
|
212
|
-
const port = ((_modernjsConfig_dev = modernjsConfig.dev) === null || _modernjsConfig_dev === void 0 ? void 0 : _modernjsConfig_dev.port) || ((
|
|
208
|
+
if (isDev && chain.output.get("publicPath") === "auto") {
|
|
209
|
+
var _modernjsConfig_dev, _modernjsConfig_server;
|
|
210
|
+
const port = ((_modernjsConfig_dev = modernjsConfig.dev) === null || _modernjsConfig_dev === void 0 ? void 0 : _modernjsConfig_dev.port) || ((_modernjsConfig_server = modernjsConfig.server) === null || _modernjsConfig_server === void 0 ? void 0 : _modernjsConfig_server.port) || 8080;
|
|
213
211
|
const publicPath = `http://localhost:${port}/`;
|
|
214
|
-
|
|
212
|
+
chain.output.publicPath(publicPath);
|
|
215
213
|
}
|
|
216
214
|
if (isServer && enableSSR) {
|
|
217
|
-
const
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
if (output && typeof chunkFileName === "string" && uniqueName && !chunkFileName.includes(uniqueName)) {
|
|
215
|
+
const uniqueName = mfConfig.name || chain.output.get("uniqueName");
|
|
216
|
+
const chunkFileName = chain.output.get("chunkFilename");
|
|
217
|
+
if (typeof chunkFileName === "string" && uniqueName && !chunkFileName.includes(uniqueName)) {
|
|
221
218
|
const suffix = `${encodeName(uniqueName)}-[chunkhash].js`;
|
|
222
|
-
output.chunkFilename
|
|
219
|
+
chain.output.chunkFilename(chunkFileName.replace(".js", suffix));
|
|
223
220
|
}
|
|
224
221
|
}
|
|
225
222
|
if (isDev && enableSSR && !isServer) {
|
|
226
|
-
|
|
227
|
-
...bundlerConfig.resolve.fallback,
|
|
228
|
-
crypto: false,
|
|
229
|
-
stream: false,
|
|
230
|
-
vm: false
|
|
231
|
-
};
|
|
223
|
+
chain.resolve.fallback.set("crypto", false).set("stream", false).set("vm", false);
|
|
232
224
|
}
|
|
233
225
|
if (((_modernjsConfig_deploy = modernjsConfig.deploy) === null || _modernjsConfig_deploy === void 0 ? void 0 : _modernjsConfig_deploy.microFrontend) && Object.keys(mfConfig.exposes || {}).length) {
|
|
234
|
-
|
|
235
|
-
bundlerConfig.optimization = {};
|
|
236
|
-
}
|
|
237
|
-
bundlerConfig.optimization.usedExports = false;
|
|
226
|
+
chain.optimization.usedExports(false);
|
|
238
227
|
}
|
|
239
228
|
}
|
|
240
229
|
const localIpv4 = "127.0.0.1";
|
|
@@ -262,33 +251,10 @@ const getIPV4 = () => {
|
|
|
262
251
|
};
|
|
263
252
|
return ipv4Interface.address;
|
|
264
253
|
};
|
|
265
|
-
const SPLIT_CHUNK_MAP = {
|
|
266
|
-
REACT: "react",
|
|
267
|
-
ROUTER: "router",
|
|
268
|
-
LODASH: "lib-lodash",
|
|
269
|
-
ANTD: "lib-antd",
|
|
270
|
-
ARCO: "lib-arco",
|
|
271
|
-
SEMI: "lib-semi",
|
|
272
|
-
AXIOS: "lib-axios"
|
|
273
|
-
};
|
|
274
|
-
const SHARED_SPLIT_CHUNK_MAP = {
|
|
275
|
-
react: SPLIT_CHUNK_MAP.REACT,
|
|
276
|
-
"react-dom": SPLIT_CHUNK_MAP.REACT,
|
|
277
|
-
"react-router": SPLIT_CHUNK_MAP.ROUTER,
|
|
278
|
-
"react-router-dom": SPLIT_CHUNK_MAP.ROUTER,
|
|
279
|
-
"@remix-run/router": SPLIT_CHUNK_MAP.ROUTER,
|
|
280
|
-
lodash: SPLIT_CHUNK_MAP.LODASH,
|
|
281
|
-
"lodash-es": SPLIT_CHUNK_MAP.LODASH,
|
|
282
|
-
antd: SPLIT_CHUNK_MAP.ANTD,
|
|
283
|
-
"@arco-design/web-react": SPLIT_CHUNK_MAP.ARCO,
|
|
284
|
-
"@douyinfe/semi-ui": SPLIT_CHUNK_MAP.SEMI,
|
|
285
|
-
axios: SPLIT_CHUNK_MAP.AXIOS
|
|
286
|
-
};
|
|
287
254
|
export {
|
|
288
255
|
addMyTypes2Ignored,
|
|
289
256
|
getIPV4,
|
|
290
257
|
getMFConfig,
|
|
291
258
|
patchBundlerConfig,
|
|
292
|
-
patchIgnoreWarning,
|
|
293
259
|
patchMFConfig
|
|
294
260
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { it, expect, describe } from "vitest";
|
|
2
|
-
import { patchMFConfig,
|
|
2
|
+
import { patchMFConfig, getIPV4 } from "./utils";
|
|
3
3
|
const mfConfig = {
|
|
4
4
|
name: "host",
|
|
5
5
|
filename: "remoteEntry.js",
|
|
@@ -86,63 +86,3 @@ describe("patchMFConfig", async () => {
|
|
|
86
86
|
});
|
|
87
87
|
});
|
|
88
88
|
});
|
|
89
|
-
describe("patchBundlerConfig", async () => {
|
|
90
|
-
it("patchBundlerConfig: server", async () => {
|
|
91
|
-
const bundlerConfig = {
|
|
92
|
-
output: {
|
|
93
|
-
publicPath: "auto"
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
patchBundlerConfig({
|
|
97
|
-
bundlerType: "webpack",
|
|
98
|
-
bundlerConfig,
|
|
99
|
-
isServer: true,
|
|
100
|
-
modernjsConfig: {
|
|
101
|
-
server: {
|
|
102
|
-
ssr: {
|
|
103
|
-
mode: "stream"
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
mfConfig
|
|
108
|
-
});
|
|
109
|
-
const expectedConfig = {
|
|
110
|
-
output: {
|
|
111
|
-
chunkLoadingGlobal: "chunk_host",
|
|
112
|
-
publicPath: "auto",
|
|
113
|
-
uniqueName: "host"
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
bundlerConfig === null || bundlerConfig === void 0 ? true : delete bundlerConfig.ignoreWarnings;
|
|
117
|
-
expect(bundlerConfig).toStrictEqual(expectedConfig);
|
|
118
|
-
});
|
|
119
|
-
it("patchBundlerConfig: client", async () => {
|
|
120
|
-
const bundlerConfig = {
|
|
121
|
-
output: {
|
|
122
|
-
publicPath: "auto"
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
patchBundlerConfig({
|
|
126
|
-
bundlerType: "webpack",
|
|
127
|
-
bundlerConfig,
|
|
128
|
-
isServer: false,
|
|
129
|
-
modernjsConfig: {
|
|
130
|
-
server: {
|
|
131
|
-
ssr: {
|
|
132
|
-
mode: "stream"
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
mfConfig
|
|
137
|
-
});
|
|
138
|
-
const expectedConfig = {
|
|
139
|
-
output: {
|
|
140
|
-
chunkLoadingGlobal: "chunk_host",
|
|
141
|
-
publicPath: "auto",
|
|
142
|
-
uniqueName: "host"
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
bundlerConfig === null || bundlerConfig === void 0 ? true : delete bundlerConfig.ignoreWarnings;
|
|
146
|
-
expect(bundlerConfig).toStrictEqual(expectedConfig);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
import type { CliPluginFuture, AppTools
|
|
2
|
-
import type { BundlerConfig } from '../interfaces/bundler';
|
|
1
|
+
import type { CliPluginFuture, AppTools } from '@modern-js/app-tools';
|
|
3
2
|
import type { InternalModernPluginOptions } from '../types';
|
|
4
|
-
import { moduleFederationPlugin } from '@module-federation/sdk';
|
|
5
3
|
export declare function setEnv(enableSSR: boolean): void;
|
|
6
|
-
export declare function modifyBundlerConfig<T extends Bundler>(options: {
|
|
7
|
-
bundlerType: Bundler;
|
|
8
|
-
mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions;
|
|
9
|
-
config: BundlerConfig<T>;
|
|
10
|
-
isServer: boolean;
|
|
11
|
-
modernjsConfig: UserConfig<AppTools>;
|
|
12
|
-
remoteIpStrategy?: 'ipv4' | 'inherit';
|
|
13
|
-
}): void;
|
|
14
4
|
export declare const moduleFederationConfigPlugin: (userConfig: InternalModernPluginOptions) => CliPluginFuture<AppTools>;
|
|
15
5
|
export default moduleFederationConfigPlugin;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { BundlerPlugin } from '../types';
|
|
2
|
-
export declare function updateStatsAndManifest(nodePlugin: BundlerPlugin, browserPlugin: BundlerPlugin, outputDir: string): void;
|
|
2
|
+
export declare function updateStatsAndManifest(nodePlugin: BundlerPlugin, browserPlugin: BundlerPlugin, outputDir: string, ssrDir: string): void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CliPluginFuture, AppTools } from '@modern-js/app-tools';
|
|
2
2
|
import type { InternalModernPluginOptions } from '../types';
|
|
3
3
|
export declare function setEnv(): void;
|
|
4
|
+
export declare const CHAIN_MF_PLUGIN_ID = "plugin-module-federation-server";
|
|
4
5
|
export declare const moduleFederationSSRPlugin: (pluginOptions: Required<InternalModernPluginOptions>) => CliPluginFuture<AppTools>;
|
|
5
6
|
export default moduleFederationSSRPlugin;
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { moduleFederationPlugin } from '@module-federation/sdk';
|
|
2
2
|
import { PluginOptions } from '../types';
|
|
3
|
-
import type {
|
|
4
|
-
import type { webpack, UserConfig, AppTools, Rspack
|
|
3
|
+
import type { BundlerChainConfig } from '../interfaces/bundler';
|
|
4
|
+
import type { webpack, UserConfig, AppTools, Rspack } from '@modern-js/app-tools';
|
|
5
5
|
export type ConfigType<T> = T extends 'webpack' ? webpack.Configuration : T extends 'rspack' ? Rspack.Configuration : never;
|
|
6
6
|
export declare const getMFConfig: (userConfig: PluginOptions) => Promise<moduleFederationPlugin.ModuleFederationPluginOptions>;
|
|
7
7
|
export declare const patchMFConfig: (mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions, isServer: boolean, remoteIpStrategy?: "ipv4" | "inherit") => moduleFederationPlugin.ModuleFederationPluginOptions;
|
|
8
|
-
export declare function patchIgnoreWarning<T extends Bundler>(bundlerConfig: BundlerConfig<T>): void;
|
|
9
8
|
export declare function addMyTypes2Ignored(chain: BundlerChainConfig, mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions): void;
|
|
10
|
-
export declare function patchBundlerConfig
|
|
11
|
-
|
|
9
|
+
export declare function patchBundlerConfig(options: {
|
|
10
|
+
chain: BundlerChainConfig;
|
|
12
11
|
isServer: boolean;
|
|
13
12
|
modernjsConfig: UserConfig<AppTools>;
|
|
14
|
-
bundlerType: Bundler;
|
|
15
13
|
mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions;
|
|
14
|
+
enableSSR: boolean;
|
|
16
15
|
}): void;
|
|
17
16
|
export declare const getIPV4: () => string;
|
|
@@ -4,7 +4,7 @@ import type { ModuleFederationPlugin as RspackModuleFederationPlugin } from '@mo
|
|
|
4
4
|
export interface PluginOptions {
|
|
5
5
|
config?: moduleFederationPlugin.ModuleFederationPluginOptions;
|
|
6
6
|
configPath?: string;
|
|
7
|
-
ssr?:
|
|
7
|
+
ssr?: boolean;
|
|
8
8
|
remoteIpStrategy?: 'ipv4' | 'inherit';
|
|
9
9
|
}
|
|
10
10
|
export interface InternalModernPluginOptions {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@module-federation/modern-js",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20250221090527",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist/",
|
|
6
6
|
"types.d.ts",
|
|
@@ -84,23 +84,23 @@
|
|
|
84
84
|
"author": "hanric <hanric.zhang@gmail.com>",
|
|
85
85
|
"license": "MIT",
|
|
86
86
|
"dependencies": {
|
|
87
|
-
"@modern-js/node-bundle-require": "2.64.
|
|
88
|
-
"@modern-js/utils": "2.64.
|
|
87
|
+
"@modern-js/node-bundle-require": "2.64.3",
|
|
88
|
+
"@modern-js/utils": "2.64.3",
|
|
89
89
|
"@swc/helpers": "0.5.13",
|
|
90
90
|
"node-fetch": "~3.3.0",
|
|
91
91
|
"react-error-boundary": "4.1.2",
|
|
92
|
-
"@module-federation/rsbuild-plugin": "0.0.0-next-
|
|
93
|
-
"@module-federation/enhanced": "0.0.0-next-
|
|
94
|
-
"@module-federation/node": "0.0.0-next-
|
|
95
|
-
"@module-federation/sdk": "0.0.0-next-
|
|
92
|
+
"@module-federation/rsbuild-plugin": "0.0.0-next-20250221090527",
|
|
93
|
+
"@module-federation/enhanced": "0.0.0-next-20250221090527",
|
|
94
|
+
"@module-federation/node": "0.0.0-next-20250221090527",
|
|
95
|
+
"@module-federation/sdk": "0.0.0-next-20250221090527"
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
|
-
"@modern-js/app-tools": "2.64.
|
|
99
|
-
"@modern-js/core": "2.64.
|
|
100
|
-
"@modern-js/module-tools": "2.64.
|
|
101
|
-
"@modern-js/runtime": "2.64.
|
|
102
|
-
"@modern-js/tsconfig": "2.64.
|
|
103
|
-
"@module-federation/manifest": "0.0.0-next-
|
|
98
|
+
"@modern-js/app-tools": "2.64.3",
|
|
99
|
+
"@modern-js/core": "2.64.3",
|
|
100
|
+
"@modern-js/module-tools": "2.64.3",
|
|
101
|
+
"@modern-js/runtime": "2.64.3",
|
|
102
|
+
"@modern-js/tsconfig": "2.64.3",
|
|
103
|
+
"@module-federation/manifest": "0.0.0-next-20250221090527"
|
|
104
104
|
},
|
|
105
105
|
"peerDependencies": {
|
|
106
106
|
"react": ">=17",
|