Skip to content

Commit 887c247

Browse files
authored
fix(dev): only rewrite SSR stacktrace when possible (#4248)
1 parent 772b2f7 commit 887c247

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

packages/vite/src/node/server/index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ import { TransformOptions as EsbuildTransformOptions } from 'esbuild'
4848
import { DepOptimizationMetadata, optimizeDeps } from '../optimizer'
4949
import { ssrLoadModule } from '../ssr/ssrModuleLoader'
5050
import { resolveSSRExternal } from '../ssr/ssrExternal'
51-
import { ssrRewriteStacktrace } from '../ssr/ssrStacktrace'
51+
import {
52+
rebindErrorStacktrace,
53+
ssrRewriteStacktrace
54+
} from '../ssr/ssrStacktrace'
5255
import { createMissingImporterRegisterFn } from '../optimizer/registerMissing'
5356
import { printServerUrls } from '../logger'
5457
import { resolveHostname } from '../utils'
@@ -366,7 +369,8 @@ export async function createServer(
366369
},
367370
ssrFixStacktrace(e) {
368371
if (e.stack) {
369-
e.stack = ssrRewriteStacktrace(e.stack, moduleGraph)
372+
const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph)
373+
rebindErrorStacktrace(e, stacktrace)
370374
}
371375
},
372376
listen(port?: number, isRestart?: boolean) {

packages/vite/src/node/ssr/ssrModuleLoader.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import fs from 'fs'
22
import path from 'path'
33
import { ViteDevServer } from '..'
44
import { cleanUrl, resolveFrom, unwrapId } from '../utils'
5-
import { ssrRewriteStacktrace } from './ssrStacktrace'
5+
import { rebindErrorStacktrace, ssrRewriteStacktrace } from './ssrStacktrace'
66
import {
77
ssrExportAllKey,
88
ssrModuleExportsKey,
@@ -141,9 +141,10 @@ async function instantiateModule(
141141
ssrExportAll
142142
)
143143
} catch (e) {
144-
e.stack = ssrRewriteStacktrace(e.stack, moduleGraph)
144+
const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph)
145+
rebindErrorStacktrace(e, stacktrace)
145146
server.config.logger.error(
146-
`Error when evaluating SSR module ${url}:\n${e.stack}`,
147+
`Error when evaluating SSR module ${url}:\n${stacktrace}`,
147148
{
148149
timestamp: true,
149150
clear: server.config.clearScreen

packages/vite/src/node/ssr/ssrStacktrace.ts

+17
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,20 @@ export function ssrRewriteStacktrace(
5656
})
5757
.join('\n')
5858
}
59+
60+
export function rebindErrorStacktrace(e: Error, stacktrace: string): void {
61+
const { configurable, writable } = Object.getOwnPropertyDescriptor(
62+
e,
63+
'stack'
64+
)!
65+
if (configurable) {
66+
Object.defineProperty(e, 'stack', {
67+
value: stacktrace,
68+
enumerable: true,
69+
configurable: true,
70+
writable: true
71+
})
72+
} else if (writable) {
73+
e.stack = stacktrace
74+
}
75+
}

0 commit comments

Comments
 (0)