Skip to content

Commit a32777f

Browse files
authored
fix: properly close optimizer on server restart (#10028)
1 parent 7f548e8 commit a32777f

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

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

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ export interface DepsOptimizer {
6666
resetRegisteredIds: () => void
6767
ensureFirstRun: () => void
6868

69+
close: () => Promise<void>
70+
6971
options: DepOptimizationOptions
7072
}
7173

packages/vite/src/node/optimizer/optimizer.ts

+25-4
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ async function createDepsOptimizer(
103103

104104
let handle: NodeJS.Timeout | undefined
105105

106+
let closed = false
107+
106108
let metadata =
107109
cachedMetadata || initDepsOptimizerMetadata(config, ssr, sessionTimestamp)
108110

@@ -118,6 +120,7 @@ async function createDepsOptimizer(
118120
delayDepsOptimizerUntil,
119121
resetRegisteredIds,
120122
ensureFirstRun,
123+
close,
121124
options: getDepOptimizationConfig(config, ssr)
122125
}
123126

@@ -159,6 +162,13 @@ async function createDepsOptimizer(
159162

160163
let postScanOptimizationResult: Promise<DepOptimizationResult> | undefined
161164

165+
let optimizingNewDeps: Promise<DepOptimizationResult> | undefined
166+
async function close() {
167+
closed = true
168+
await postScanOptimizationResult
169+
await optimizingNewDeps
170+
}
171+
162172
if (!cachedMetadata) {
163173
// Enter processing state until crawl of static imports ends
164174
currentlyProcessing = true
@@ -288,15 +298,24 @@ async function createDepsOptimizer(
288298
// Ensure that a rerun will not be issued for current discovered deps
289299
if (handle) clearTimeout(handle)
290300

291-
if (Object.keys(metadata.discovered).length === 0) {
301+
if (closed || Object.keys(metadata.discovered).length === 0) {
292302
currentlyProcessing = false
293303
return
294304
}
295305

296306
currentlyProcessing = true
297307

298308
try {
299-
const processingResult = preRunResult ?? (await optimizeNewDeps())
309+
const processingResult =
310+
preRunResult ?? (await (optimizingNewDeps = optimizeNewDeps()))
311+
optimizingNewDeps = undefined
312+
313+
if (closed) {
314+
currentlyProcessing = false
315+
processingResult.cancel()
316+
resolveEnqueuedProcessingPromises()
317+
return
318+
}
300319

301320
const newData = processingResult.metadata
302321

@@ -665,7 +684,7 @@ async function createDepsOptimizer(
665684
function ensureFirstRun() {
666685
if (!firstRunEnsured && !firstRunCalled && registeredIds.length === 0) {
667686
setTimeout(() => {
668-
if (registeredIds.length === 0) {
687+
if (!closed && registeredIds.length === 0) {
669688
onCrawlEnd()
670689
}
671690
}, runOptimizerIfIdleAfterMs)
@@ -699,7 +718,7 @@ async function createDepsOptimizer(
699718
waitingOn = next.id
700719
const afterLoad = () => {
701720
waitingOn = undefined
702-
if (!workersSources.has(next.id)) {
721+
if (!closed && !workersSources.has(next.id)) {
703722
if (registeredIds.length > 0) {
704723
runOptimizerWhenIdle()
705724
} else {
@@ -745,6 +764,8 @@ async function createDevSsrDepsOptimizer(
745764
delayDepsOptimizerUntil: (id: string, done: () => Promise<any>) => {},
746765
resetRegisteredIds: () => {},
747766
ensureFirstRun: () => {},
767+
768+
close: async () => {},
748769
options: config.ssr.optimizeDeps
749770
}
750771
devSsrDepsOptimizerMap.set(config, depsOptimizer)

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

+2
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ export async function createServer(
398398
watcher.close(),
399399
ws.close(),
400400
container.close(),
401+
getDepsOptimizer(server.config)?.close(),
402+
getDepsOptimizer(server.config, true)?.close(),
401403
closeHttpServer()
402404
])
403405
server.resolvedUrls = null

0 commit comments

Comments
 (0)