diff --git a/packages/vite/src/module-runner/importMetaResolver.ts b/packages/vite/src/module-runner/importMetaResolver.ts index 5611e6171075c6..a645425c70f395 100644 --- a/packages/vite/src/module-runner/importMetaResolver.ts +++ b/packages/vite/src/module-runner/importMetaResolver.ts @@ -33,7 +33,16 @@ function customizationHookResolve( return nextResolve(specifier, context) } +// Ensure that we only register the hook once +// Otherwise, a hook will be registered for each createImportMetaResolver call +// and eventually cause "Maximum call stack size exceeded" errors +let isHookRegistered = false + export function createImportMetaResolver(): ImportMetaResolver | undefined { + if (isHookRegistered) { + return importMetaResolveWithCustomHook + } + let module: typeof import('node:module') | undefined try { module = @@ -53,6 +62,7 @@ export function createImportMetaResolver(): ImportMetaResolver | undefined { if (module.registerHooks) { // eslint-disable-next-line n/no-unsupported-features/node-builtins -- we checked the existence module.registerHooks({ resolve: customizationHookResolve }) + isHookRegistered = true return importMetaResolveWithCustomHook } @@ -73,6 +83,7 @@ export function createImportMetaResolver(): ImportMetaResolver | undefined { throw e } + isHookRegistered = true return importMetaResolveWithCustomHook }