diff --git a/docs/guide/api-javascript.md b/docs/guide/api-javascript.md index 1651923c06cdcb..ddaa04279737f5 100644 --- a/docs/guide/api-javascript.md +++ b/docs/guide/api-javascript.md @@ -94,7 +94,7 @@ interface ViteDevServer { */ ssrLoadModule( url: string, - options?: { isolated?: boolean } + options?: { fixStacktrace?: boolean } ): Promise> /** * Fix ssr error stacktrace. diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index aeea862dbc173f..77e33cd31a0995 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -224,7 +224,10 @@ export interface ViteDevServer { /** * Load a given URL as an instantiated module for SSR. */ - ssrLoadModule(url: string): Promise> + ssrLoadModule( + url: string, + opts?: { fixStacktrace?: boolean } + ): Promise> /** * Fix ssr error stacktrace */ @@ -361,14 +364,20 @@ export async function createServer( return transformRequest(url, server, options) }, transformIndexHtml: null!, // to be immediately set - ssrLoadModule(url) { + ssrLoadModule(url, opts?: { fixStacktrace?: boolean }) { server._ssrExternals ||= resolveSSRExternal( config, server._optimizeDepsMetadata ? Object.keys(server._optimizeDepsMetadata.optimized) : [] ) - return ssrLoadModule(url, server) + return ssrLoadModule( + url, + server, + undefined, + undefined, + opts?.fixStacktrace + ) }, ssrFixStacktrace(e) { if (e.stack) { diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index f0eb1bbfc0339e..de31c6a20266c5 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -35,7 +35,8 @@ export async function ssrLoadModule( url: string, server: ViteDevServer, context: SSRContext = { global }, - urlStack: string[] = [] + urlStack: string[] = [], + fixStacktrace?: boolean ): Promise { url = unwrapId(url).replace(NULL_BYTE_PLACEHOLDER, '\0') @@ -48,7 +49,13 @@ export async function ssrLoadModule( return pending } - const modulePromise = instantiateModule(url, server, context, urlStack) + const modulePromise = instantiateModule( + url, + server, + context, + urlStack, + fixStacktrace + ) pendingModules.set(url, modulePromise) modulePromise .catch(() => { @@ -64,7 +71,8 @@ async function instantiateModule( url: string, server: ViteDevServer, context: SSRContext = { global }, - urlStack: string[] = [] + urlStack: string[] = [], + fixStacktrace?: boolean ): Promise { const { moduleGraph } = server const mod = await moduleGraph.ensureEntryFromUrl(url, true) @@ -132,7 +140,13 @@ async function instantiateModule( if (pendingDeps.length === 1) { pendingImports.set(url, pendingDeps) } - const mod = await ssrLoadModule(dep, server, context, urlStack) + const mod = await ssrLoadModule( + dep, + server, + context, + urlStack, + fixStacktrace + ) if (pendingDeps.length === 1) { pendingImports.delete(url) } else { @@ -188,7 +202,7 @@ async function instantiateModule( ssrExportAll ) } catch (e) { - if (e.stack) { + if (e.stack && fixStacktrace !== false) { const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph) rebindErrorStacktrace(e, stacktrace) server.config.logger.error(