From 89d01ebb8eb4948f576f2d483082c5dd4bf056e7 Mon Sep 17 00:00:00 2001 From: patak Date: Tue, 11 Jul 2023 15:41:52 +0200 Subject: [PATCH] fix: avoid early error when server is closed in ssr (#13787) Co-authored-by: Bjorn Lu <34116392+bluwy@users.noreply.github.com> --- packages/vite/src/node/server/index.ts | 8 +++++--- packages/vite/src/node/server/pluginContainer.ts | 6 +++--- packages/vite/src/node/server/transformRequest.ts | 6 +++--- playground/ssr/server.js | 1 + 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index f41ba379eb91e7..46d98dae645fc6 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -464,9 +464,11 @@ export async function _createServer( closeHttpServer(), ]) // Await pending requests. We throw early in transformRequest - // and in hooks if the server is closing, so the import analysis - // plugin stops pre-transforming static imports and this block - // is resolved sooner. + // and in hooks if the server is closing for non-ssr requests, + // so the import analysis plugin stops pre-transforming static + // imports and this block is resolved sooner. + // During SSR, we let pending requests finish to avoid exposing + // the server closed error to the users. while (server._pendingRequests.size > 0) { await Promise.allSettled( [...server._pendingRequests.values()].map( diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index 3efe4c16e8f9e9..b38601e56ca97d 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -649,7 +649,7 @@ export async function createPluginContainer( let id: string | null = null const partial: Partial = {} for (const plugin of getSortedPlugins('resolveId')) { - if (closed) throwClosedServerError() + if (closed && !ssr) throwClosedServerError() if (!plugin.resolveId) continue if (skip?.has(plugin)) continue @@ -714,7 +714,7 @@ export async function createPluginContainer( const ctx = new Context() ctx.ssr = !!ssr for (const plugin of getSortedPlugins('load')) { - if (closed) throwClosedServerError() + if (closed && !ssr) throwClosedServerError() if (!plugin.load) continue ctx._activePlugin = plugin const handler = @@ -738,7 +738,7 @@ export async function createPluginContainer( const ctx = new TransformContext(id, code, inMap as SourceMap) ctx.ssr = !!ssr for (const plugin of getSortedPlugins('transform')) { - if (closed) throwClosedServerError() + if (closed && !ssr) throwClosedServerError() if (!plugin.transform) continue ctx._activePlugin = plugin ctx._activeId = id diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index 2c9c58c47d7ea3..d9bd1fd44643fc 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -47,7 +47,7 @@ export function transformRequest( server: ViteDevServer, options: TransformOptions = {}, ): Promise { - if (server._restartPromise) throwClosedServerError() + if (server._restartPromise && !options.ssr) throwClosedServerError() const cacheKey = (options.ssr ? 'ssr:' : options.html ? 'html:' : '') + url @@ -256,7 +256,7 @@ async function loadAndTransform( throw err } - if (server._restartPromise) throwClosedServerError() + if (server._restartPromise && !ssr) throwClosedServerError() // ensure module in graph after successful load mod ??= await moduleGraph._ensureEntryFromUrl(url, ssr, undefined, resolved) @@ -319,7 +319,7 @@ async function loadAndTransform( } } - if (server._restartPromise) throwClosedServerError() + if (server._restartPromise && !ssr) throwClosedServerError() const result = ssr && !server.config.experimental.skipSsrTransform diff --git a/playground/ssr/server.js b/playground/ssr/server.js index 262a7b550bb8a2..33f4369220d4f4 100644 --- a/playground/ssr/server.js +++ b/playground/ssr/server.js @@ -57,6 +57,7 @@ export async function createServer( res.status(200).set({ 'Content-Type': 'text/html' }).end(html) } catch (e) { vite && vite.ssrFixStacktrace(e) + if (isTest) throw e console.log(e.stack) res.status(500).end(e.stack) }