Skip to content

Commit bce6cd9

Browse files
authoredMar 17, 2025··
fix(runtime): preload filter loaded resources (#3587)
1 parent 2d086fc commit bce6cd9

File tree

6 files changed

+59
-14
lines changed

6 files changed

+59
-14
lines changed
 

‎.changeset/pink-rings-reply.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@module-federation/runtime-core': patch
3+
---
4+
5+
fix(runtime): preload filter loaded resources

‎packages/modernjs/src/cli/configPlugin.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
getMFConfig,
88
patchMFConfig,
99
addMyTypes2Ignored,
10+
isWebTarget,
11+
skipByTarget,
1012
} from './utils';
1113

1214
export function setEnv(enableSSR: boolean) {
@@ -34,21 +36,26 @@ export const moduleFederationConfigPlugin = (
3436
const enableSSR =
3537
userConfig.userConfig?.ssr ?? Boolean(modernjsConfig?.server?.ssr);
3638

37-
api.modifyBundlerChain((chain, { isServer }) => {
39+
api.modifyBundlerChain((chain) => {
40+
const target = chain.get('target');
41+
if (skipByTarget(target)) {
42+
return;
43+
}
44+
const isWeb = isWebTarget(target);
3845
// @ts-expect-error chain type is not correct
39-
addMyTypes2Ignored(chain, isServer ? ssrConfig : csrConfig);
46+
addMyTypes2Ignored(chain, !isWeb ? ssrConfig : csrConfig);
4047

41-
const targetMFConfig = isServer ? ssrConfig : csrConfig;
48+
const targetMFConfig = !isWeb ? ssrConfig : csrConfig;
4249
patchMFConfig(
4350
targetMFConfig,
44-
isServer,
51+
!isWeb,
4552
userConfig.remoteIpStrategy || 'ipv4',
4653
);
4754

4855
patchBundlerConfig({
4956
// @ts-expect-error chain type is not correct
5057
chain,
51-
isServer,
58+
isServer: !isWeb,
5259
modernjsConfig,
5360
mfConfig,
5461
enableSSR,
@@ -107,3 +114,5 @@ export const moduleFederationConfigPlugin = (
107114
});
108115

109116
export default moduleFederationConfigPlugin;
117+
118+
export { isWebTarget, skipByTarget };

‎packages/modernjs/src/cli/ssrPlugin.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { updateStatsAndManifest } from './manifest';
99
import { isDev } from './constant';
1010
import { MODERN_JS_SERVER_DIR } from '../constant';
1111
import logger from './logger';
12-
import { isWebTarget } from './utils';
12+
import { isWebTarget, skipByTarget } from './utils';
1313

1414
export function setEnv() {
1515
process.env['MF_DISABLE_EMIT_STATS'] = 'true';
@@ -48,15 +48,19 @@ export const moduleFederationSSRPlugin = (
4848
});
4949
return { entrypoint, plugins };
5050
});
51-
api.modifyBundlerChain((chain, { isServer }) => {
51+
api.modifyBundlerChain((chain) => {
52+
const target = chain.get('target');
53+
if (skipByTarget(target)) {
54+
return;
55+
}
5256
const bundlerType =
5357
api.getAppContext().bundlerType === 'rspack' ? 'rspack' : 'webpack';
5458
const MFPlugin =
5559
bundlerType === 'webpack'
5660
? ModuleFederationPlugin
5761
: RspackModuleFederationPlugin;
5862

59-
const isWeb = isWebTarget(chain.get('target'));
63+
const isWeb = isWebTarget(target);
6064

6165
if (!isWeb) {
6266
if (!chain.plugins.has(CHAIN_MF_PLUGIN_ID)) {
@@ -79,13 +83,13 @@ export const moduleFederationSSRPlugin = (
7983
}
8084
}
8185

82-
if (isDev && !isServer) {
86+
if (isDev && isWeb) {
8387
chain.externals({
8488
'@module-federation/node/utils': 'NOT_USED_IN_BROWSER',
8589
});
8690
}
8791

88-
if (isServer) {
92+
if (!isWeb) {
8993
ssrOutputPath =
9094
chain.output.get('path') ||
9195
path.resolve(process.cwd(), `dist/${MODERN_JS_SERVER_DIR}`);

‎packages/modernjs/src/cli/utils.ts

+10
Original file line numberDiff line numberDiff line change
@@ -389,3 +389,13 @@ export const isWebTarget = (target: string[] | string) => {
389389
}
390390
return false;
391391
};
392+
393+
export const skipByTarget = (target: string[] | string) => {
394+
const IGNORE_TARGET = 'webworker';
395+
if (Array.isArray(target)) {
396+
return target.includes(IGNORE_TARGET);
397+
} else if (typeof target === 'string') {
398+
return target === IGNORE_TARGET;
399+
}
400+
return false;
401+
};
+4-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
export * from '@module-federation/enhanced/runtime';
2-
export { createRemoteSSRComponent } from './createRemoteSSRComponent';
2+
export {
3+
createRemoteSSRComponent,
4+
collectSSRAssets,
5+
} from './createRemoteSSRComponent';

‎packages/runtime-core/src/plugins/generate-preload-assets.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
ProviderModuleInfo,
55
isManifestProvider,
66
getResourceUrl,
7+
isBrowserEnv,
78
} from '@module-federation/sdk';
89
import {
910
EntryAssets,
@@ -101,6 +102,12 @@ function traverseModuleInfo(
101102
}
102103
}
103104

105+
const isExisted = (type: 'link' | 'script', url: string) => {
106+
return document.querySelector(
107+
`${type}[${type === 'link' ? 'href' : 'src'}="${url}"]`,
108+
);
109+
};
110+
104111
// eslint-disable-next-line max-lines-per-function
105112
export function generatePreloadAssets(
106113
origin: FederationHost,
@@ -290,16 +297,16 @@ export function generatePreloadAssets(
290297
}
291298

292299
const needPreloadJsAssets = jsAssets.filter(
293-
(asset) => !loadedSharedJsAssets.has(asset),
300+
(asset) => !loadedSharedJsAssets.has(asset) && !isExisted('script', asset),
294301
);
295302
const needPreloadCssAssets = cssAssets.filter(
296-
(asset) => !loadedSharedCssAssets.has(asset),
303+
(asset) => !loadedSharedCssAssets.has(asset) && !isExisted('link', asset),
297304
);
298305

299306
return {
300307
cssAssets: needPreloadCssAssets,
301308
jsAssetsWithoutEntry: needPreloadJsAssets,
302-
entryAssets,
309+
entryAssets: entryAssets.filter((entry) => !isExisted('script', entry.url)),
303310
};
304311
}
305312

@@ -316,6 +323,13 @@ export const generatePreloadAssetsPlugin: () => FederationRuntimePlugin =
316323
globalSnapshot,
317324
remoteSnapshot,
318325
} = args;
326+
if (!isBrowserEnv()) {
327+
return {
328+
cssAssets: [],
329+
jsAssetsWithoutEntry: [],
330+
entryAssets: [],
331+
};
332+
}
319333

320334
if (isRemoteInfoWithEntry(remote) && isPureRemoteEntry(remote)) {
321335
return {

0 commit comments

Comments
 (0)
Please sign in to comment.