From dc8e3a35200ecab3251e6c9f1fb0c773301c62bf Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sun, 20 Jul 2025 21:00:19 +0200 Subject: [PATCH 1/3] fix(dev): add exception handlers for initial restart --- packages/nuxi/src/dev/index.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/nuxi/src/dev/index.ts b/packages/nuxi/src/dev/index.ts index b8a2f5d8e..07c2b5f5b 100644 --- a/packages/nuxi/src/dev/index.ts +++ b/packages/nuxi/src/dev/index.ts @@ -150,7 +150,16 @@ export async function initialize(devContext: NuxtDevContext, ctx: InitializeOpti } }, onRestart: (callback: (devServer: NuxtDevServer) => void) => { - devServer.once('restart', () => callback(devServer)) + let restarted = false + function restart() { + if (!restarted) { + restarted = true + callback(devServer) + } + } + devServer.once('restart', restart) + process.once('uncaughtException', restart) + process.once('unhandledRejection', restart) }, } } From 4e73bbe353d49d9cd878f0e383406780d68799e4 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sun, 20 Jul 2025 21:22:51 +0200 Subject: [PATCH 2/3] fix: ignore errors thrown when closing devServer --- packages/nuxi/src/commands/dev.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index c54566f75..7a9f4d9a4 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -161,8 +161,10 @@ const command = defineCommand({ // ... then fall back to pre-warmed fork if a hard restart is required const fork = startSubprocess(cwd, ctx.args, ctx.rawArgs, listenOptions) onRestart(async (devServer) => { - await devServer.close() - const subprocess = await fork + const [subprocess] = await Promise.all([ + fork, + devServer.close().catch(() => {}), + ]) await subprocess.initialize(devProxy, useSocket) }) From b0d706df4049d735334eb850d3cd936441d61937 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 21 Jul 2025 10:03:20 +0200 Subject: [PATCH 3/3] fix: do not kill process if it is not a fork --- packages/nuxi/src/dev/index.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/nuxi/src/dev/index.ts b/packages/nuxi/src/dev/index.ts index 14477ec7a..84967ff40 100644 --- a/packages/nuxi/src/dev/index.ts +++ b/packages/nuxi/src/dev/index.ts @@ -23,10 +23,13 @@ interface InitializeOptions { class IPC { enabled = !!process.send && !process.title?.includes('vitest') && process.env.__NUXT__FORK constructor() { - process.once('unhandledRejection', (reason) => { - this.send({ type: 'nuxt:internal:dev:rejection', message: reason instanceof Error ? reason.toString() : 'Unhandled Rejection' }) - process.exit() - }) + // only kill process if it is a fork + if (this.enabled) { + process.once('unhandledRejection', (reason) => { + this.send({ type: 'nuxt:internal:dev:rejection', message: reason instanceof Error ? reason.toString() : 'Unhandled Rejection' }) + process.exit() + }) + } process.on('message', (message: NuxtParentIPCMessage) => { if (message.type === 'nuxt:internal:dev:context') { initialize(message.context, {}, message.socket ? undefined : true)