Skip to content

Commit 6990192

Browse files
authored
feat: add moduleParseTimeout config (#391)
1 parent d9f1f69 commit 6990192

File tree

6 files changed

+52
-23
lines changed

6 files changed

+52
-23
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ export default defineConfig({
118118
// When false (default), the plugin will not process any CSS assets.
119119
// When true, all CSS assets are bundled into every exposed module.
120120
bundleAllCSS: false, // or true
121+
// Timeout for parsing modules in seconds.
122+
// Defaults to 10 seconds.
123+
moduleParseTimeout: 10,
121124
}),
122125
],
123126
server: {
@@ -134,6 +137,7 @@ export default defineConfig({
134137

135138
The host app configuration specifies its name, the filename of its exposed remote entry remoteEntry.js, and importantly, the configuration of the remote application to load.
136139
You can specify the place the host initialization file is injected with the **hostInitInjectLocation** option, which is described in the example code above.
140+
The **moduleParseTimeout** option allows you to configure the maximum time to wait for module parsing during the build process.
137141

138142
## Load the Remote App
139143

examples/vite-webpack-rspack/host/vite.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const mfConfig = {
2323
},
2424
},
2525
shared: ['react', 'react-dom', 'lodash'],
26+
moduleParseTimeout: 2,
2627
};
2728

2829
// https://vitejs.dev/config/

src/index.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { Plugin } from 'vite';
33
import addEntry from './plugins/pluginAddEntry';
44
import { checkAliasConflicts } from './plugins/pluginCheckAliasConflicts';
55
import { PluginDevProxyModuleTopLevelAwait } from './plugins/pluginDevProxyModuleTopLevelAwait';
6+
import pluginDts from './plugins/pluginDts';
67
import pluginManifest from './plugins/pluginMFManifest';
78
import pluginModuleParseEnd from './plugins/pluginModuleParseEnd';
89
import pluginProxyRemoteEntry from './plugins/pluginProxyRemoteEntry';
910
import pluginProxyRemotes from './plugins/pluginProxyRemotes';
10-
import pluginDts from './plugins/pluginDts';
1111
import { proxySharedModule } from './plugins/pluginProxySharedModule_preBuild';
1212
import aliasToArrayPlugin from './utils/aliasToArrayPlugin';
1313
import {
@@ -62,14 +62,19 @@ function federation(mfUserOptions: ModuleFederationOptions): Plugin[] {
6262
}),
6363
pluginProxyRemoteEntry(),
6464
pluginProxyRemotes(options),
65-
...pluginModuleParseEnd((id: string) => {
66-
return (
67-
id.includes(getHostAutoInitImportId()) ||
68-
id.includes(REMOTE_ENTRY_ID) ||
69-
id.includes(VIRTUAL_EXPOSES) ||
70-
id.includes(getLocalSharedImportMapPath())
71-
);
72-
}),
65+
...pluginModuleParseEnd(
66+
(id: string) => {
67+
return (
68+
id.includes(getHostAutoInitImportId()) ||
69+
id.includes(REMOTE_ENTRY_ID) ||
70+
id.includes(VIRTUAL_EXPOSES) ||
71+
id.includes(getLocalSharedImportMapPath())
72+
);
73+
},
74+
{
75+
moduleParseTimeout: options.moduleParseTimeout,
76+
}
77+
),
7378
...proxySharedModule({
7479
shared,
7580
}),

src/plugins/pluginModuleParseEnd.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,37 @@
55
import { Plugin } from 'vite';
66
import { VIRTUAL_EXPOSES } from '../virtualModules';
77

8-
let _resolve: any,
9-
_reject: any,
10-
_parseTimeout: any,
11-
promise = new Promise((resolve, reject) => {
8+
let _resolve: any, _reject: any, _parseTimeout: any;
9+
10+
const promise = new Promise((resolve, reject) => {
11+
_resolve = (v: any) => {
12+
clearTimeout(_parseTimeout);
13+
_parseTimeout = null;
14+
resolve(v);
15+
};
16+
_reject = (e: any) => {
17+
clearTimeout(_parseTimeout);
18+
_parseTimeout = null;
19+
reject(e);
20+
};
21+
});
22+
23+
function setParseTimeout(timeout: number) {
24+
if (!_parseTimeout) {
1225
_parseTimeout = setTimeout(() => {
13-
console.warn('Parse timeout (5s) - forcing resolve');
14-
resolve(1);
15-
}, 5000);
16-
_resolve = (v: any) => {
17-
clearTimeout(_parseTimeout);
18-
resolve(v);
19-
};
20-
_reject = reject;
21-
});
26+
console.warn(`Parse timeout (${timeout}s) - forcing resolve`);
27+
_resolve(1);
28+
}, timeout * 1000);
29+
}
30+
}
31+
2232
let parsePromise = promise;
2333
let exposesParseEnd = false;
2434

2535
const parseStartSet = new Set();
2636
const parseEndSet = new Set();
27-
export default function (excludeFn: Function): Plugin[] {
37+
export default function (excludeFn: Function, options: { moduleParseTimeout: number }): Plugin[] {
38+
setParseTimeout(options.moduleParseTimeout);
2839
return [
2940
{
3041
name: '_',

src/utils/__tests__/normalizeModuleFederationOption.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ describe('normalizeModuleFederationOption', () => {
3131
bundleAllCSS: false,
3232
getPublicPath: undefined,
3333
publicPath: undefined,
34+
moduleParseTimeout: 10,
3435
});
3536
});
3637

src/utils/normalizeModuleFederationOptions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ export type ModuleFederationOptions = {
317317
ignoreOrigin?: boolean;
318318
virtualModuleDir?: string;
319319
hostInitInjectLocation?: HostInitInjectLocationOptions;
320+
/**
321+
* Timeout for parsing modules in seconds.
322+
* Defaults to 10 seconds.
323+
*/
324+
moduleParseTimeout?: number;
320325
};
321326

322327
export interface NormalizedModuleFederationOptions {
@@ -346,6 +351,7 @@ export interface NormalizedModuleFederationOptions {
346351
* When true, all CSS assets are bundled into every exposed module.
347352
*/
348353
bundleAllCSS: boolean;
354+
moduleParseTimeout: number;
349355
}
350356

351357
type HostInitInjectLocationOptions = 'entry' | 'html';
@@ -457,5 +463,6 @@ export function normalizeModuleFederationOptions(
457463
virtualModuleDir: options.virtualModuleDir || '__mf__virtual',
458464
hostInitInjectLocation: options.hostInitInjectLocation || 'html',
459465
bundleAllCSS: options.bundleAllCSS || false,
466+
moduleParseTimeout: options.moduleParseTimeout || 10,
460467
});
461468
}

0 commit comments

Comments
 (0)