@module-federation/modern-js 0.0.0-next-20250221033258 → 0.0.0-next-20250221081237

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.
@@ -10,6 +10,7 @@ function setEnv() {
10
10
  process.env["MF_DISABLE_EMIT_STATS"] = "true";
11
11
  process.env["MF_SSR_PRJ"] = "true";
12
12
  }
13
+ const CHAIN_MF_PLUGIN_ID = "plugin-module-federation-server";
13
14
  const moduleFederationSSRPlugin = (pluginOptions) => ({
14
15
  name: "@modern-js/plugin-module-federation-ssr",
15
16
  pre: [
@@ -19,7 +20,8 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
19
20
  setup: async (api) => {
20
21
  var _pluginOptions_userConfig, _modernjsConfig_server;
21
22
  const modernjsConfig = api.getConfig();
22
- const enableSSR = ((_pluginOptions_userConfig = pluginOptions.userConfig) === null || _pluginOptions_userConfig === void 0 ? void 0 : _pluginOptions_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);
23
+ var _pluginOptions_userConfig_ssr;
24
+ 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);
23
25
  if (!enableSSR) {
24
26
  return;
25
27
  }
@@ -41,33 +43,34 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
41
43
  plugins
42
44
  };
43
45
  });
46
+ api.modifyBundlerChain((chain, { isServer }) => {
47
+ const bundlerType = api.getAppContext().bundlerType === "rspack" ? "rspack" : "webpack";
48
+ const MFPlugin = bundlerType === "webpack" ? ModuleFederationPlugin : RspackModuleFederationPlugin;
49
+ if (isServer) {
50
+ if (!chain.plugins.has(CHAIN_MF_PLUGIN_ID)) {
51
+ chain.plugin(CHAIN_MF_PLUGIN_ID).use(MFPlugin, [
52
+ pluginOptions.ssrConfig
53
+ ]).init((Plugin, args) => {
54
+ pluginOptions.nodePlugin = new Plugin(args[0]);
55
+ return pluginOptions.nodePlugin;
56
+ });
57
+ }
58
+ }
59
+ if (isServer) {
60
+ chain.target("async-node");
61
+ if (isDev) {
62
+ chain.plugin("UniverseEntryChunkTrackerPlugin").use(UniverseEntryChunkTrackerPlugin);
63
+ }
64
+ }
65
+ if (isDev && !isServer) {
66
+ chain.externals({
67
+ "@module-federation/node/utils": "NOT_USED_IN_BROWSER"
68
+ });
69
+ }
70
+ });
44
71
  api.config(() => {
45
72
  return {
46
73
  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
74
  devServer: {
72
75
  before: [
73
76
  (req, res, next) => {
@@ -93,19 +96,6 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
93
96
  }
94
97
  }
95
98
  ]
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
99
  }
110
100
  }
111
101
  };
@@ -122,6 +112,7 @@ const moduleFederationSSRPlugin = (pluginOptions) => ({
122
112
  });
123
113
  var ssrPlugin_default = moduleFederationSSRPlugin;
124
114
  export {
115
+ CHAIN_MF_PLUGIN_ID,
125
116
  ssrPlugin_default as default,
126
117
  moduleFederationSSRPlugin,
127
118
  setEnv
@@ -135,19 +135,20 @@ const patchMFConfig = (mfConfig, isServer, remoteIpStrategy) => {
135
135
  mfConfig.dev = false;
136
136
  return mfConfig;
137
137
  };
138
- function patchIgnoreWarning(bundlerConfig) {
139
- bundlerConfig.ignoreWarnings = bundlerConfig.ignoreWarnings || [];
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
- bundlerConfig.ignoreWarnings.push((warning) => {
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 _modernjsConfig_server, _bundlerConfig_optimization, _bundlerConfig_optimization1, _bundlerConfig_output, _modernjsConfig_deploy;
190
- const { bundlerConfig, modernjsConfig, isServer, mfConfig, bundlerType } = options;
191
- const enableSSR = Boolean((_modernjsConfig_server = modernjsConfig.server) === null || _modernjsConfig_server === void 0 ? void 0 : _modernjsConfig_server.ssr);
192
- (_bundlerConfig_optimization = bundlerConfig.optimization) === null || _bundlerConfig_optimization === void 0 ? true : delete _bundlerConfig_optimization.runtimeChunk;
193
- patchIgnoreWarning(bundlerConfig);
194
- if (bundlerConfig.output) {
195
- var _bundlerConfig_output1, _bundlerConfig_output2;
196
- if (!((_bundlerConfig_output1 = bundlerConfig.output) === null || _bundlerConfig_output1 === void 0 ? void 0 : _bundlerConfig_output1.chunkLoadingGlobal)) {
197
- bundlerConfig.output.chunkLoadingGlobal = `chunk_${mfConfig.name}`;
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, bundlerConfig);
202
+ autoDeleteSplitChunkCacheGroups(mfConfig, splitChunkConfig);
205
203
  }
206
- if (!isServer && enableSSR && typeof ((_bundlerConfig_optimization1 = bundlerConfig.optimization) === null || _bundlerConfig_optimization1 === void 0 ? void 0 : _bundlerConfig_optimization1.splitChunks) === "object" && bundlerConfig.optimization.splitChunks.cacheGroups) {
207
- bundlerConfig.optimization.splitChunks.chunks = "async";
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 && ((_bundlerConfig_output = bundlerConfig.output) === null || _bundlerConfig_output === void 0 ? void 0 : _bundlerConfig_output.publicPath) === "auto") {
211
- var _modernjsConfig_dev, _modernjsConfig_server1;
212
- const port = ((_modernjsConfig_dev = modernjsConfig.dev) === null || _modernjsConfig_dev === void 0 ? void 0 : _modernjsConfig_dev.port) || ((_modernjsConfig_server1 = modernjsConfig.server) === null || _modernjsConfig_server1 === void 0 ? void 0 : _modernjsConfig_server1.port) || 8080;
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
- bundlerConfig.output.publicPath = publicPath;
212
+ chain.output.publicPath(publicPath);
215
213
  }
216
214
  if (isServer && enableSSR) {
217
- const { output } = bundlerConfig;
218
- const uniqueName = mfConfig.name || (output === null || output === void 0 ? void 0 : output.uniqueName);
219
- const chunkFileName = output === null || output === void 0 ? void 0 : output.chunkFilename;
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 = chunkFileName.replace(".js", suffix);
219
+ chain.output.chunkFilename(chunkFileName.replace(".js", suffix));
223
220
  }
224
221
  }
225
222
  if (isDev && enableSSR && !isServer) {
226
- bundlerConfig.resolve.fallback = {
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
- if (!bundlerConfig.optimization) {
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, patchBundlerConfig, getIPV4 } from "./utils";
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, UserConfig, Bundler } from '@modern-js/app-tools';
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,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 { BundlerConfig, BundlerChainConfig } from '../interfaces/bundler';
4
- import type { webpack, UserConfig, AppTools, Rspack, Bundler } from '@modern-js/app-tools';
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<T extends Bundler>(options: {
11
- bundlerConfig: BundlerConfig<T>;
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?: false;
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-20250221033258",
3
+ "version": "0.0.0-next-20250221081237",
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.0",
88
- "@modern-js/utils": "2.64.0",
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-20250221033258",
93
- "@module-federation/enhanced": "0.0.0-next-20250221033258",
94
- "@module-federation/node": "0.0.0-next-20250221033258",
95
- "@module-federation/sdk": "0.0.0-next-20250221033258"
92
+ "@module-federation/rsbuild-plugin": "0.0.0-next-20250221081237",
93
+ "@module-federation/enhanced": "0.0.0-next-20250221081237",
94
+ "@module-federation/node": "0.0.0-next-20250221081237",
95
+ "@module-federation/sdk": "0.0.0-next-20250221081237"
96
96
  },
97
97
  "devDependencies": {
98
- "@modern-js/app-tools": "2.64.0",
99
- "@modern-js/core": "2.64.0",
100
- "@modern-js/module-tools": "2.64.0",
101
- "@modern-js/runtime": "2.64.0",
102
- "@modern-js/tsconfig": "2.64.0",
103
- "@module-federation/manifest": "0.0.0-next-20250221033258"
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-20250221081237"
104
104
  },
105
105
  "peerDependencies": {
106
106
  "react": ">=17",