From e954ed25099d9217d30a5a4d38e5dfee5acee0fd Mon Sep 17 00:00:00 2001 From: Evan You Date: Sun, 17 Jan 2021 15:22:52 -0500 Subject: [PATCH] feat(ssr): isolated mode --- packages/vite/src/node/server/index.ts | 9 ++++++--- packages/vite/src/node/ssr/ssrModuleLoader.ts | 11 +++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 4a01ba2d07f3a8..887a111992b0fd 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -187,7 +187,10 @@ export interface ViteDevServer { /** * Load a given URL as an instantiated module for SSR. */ - ssrLoadModule(url: string): Promise> + ssrLoadModule( + url: string, + options?: { isolated?: boolean } + ): Promise> /** * Fix ssr error stacktrace */ @@ -254,11 +257,11 @@ export async function createServer( transformRequest(url, options) { return transformRequest(url, server, options) }, - ssrLoadModule(url) { + ssrLoadModule(url, options) { if (!server._ssrExternals) { server._ssrExternals = resolveSSRExternal(config.root) } - return ssrLoadModule(url, server) + return ssrLoadModule(url, server, !!options?.isolated) }, ssrFixStacktrace(e) { if (e.stack) { diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 94325f6788dddd..b4dc803cfe65e9 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -14,6 +14,7 @@ import { transformRequest } from '../server/transformRequest' export async function ssrLoadModule( url: string, server: ViteDevServer, + isolatedMode: boolean, urlStack: string[] = [] ): Promise> { if (urlStack.includes(url)) { @@ -25,11 +26,13 @@ export async function ssrLoadModule( const { moduleGraph } = server const mod = await moduleGraph.ensureEntryFromUrl(url) - if (mod.ssrModule) { + if (!isolatedMode && mod.ssrModule) { return mod.ssrModule } - const result = await transformRequest(url, server, { ssr: true }) + const result = + mod.ssrTransformResult || + (await transformRequest(url, server, { ssr: true })) if (!result) { // TODO more info? is this even necessary? throw new Error(`failed to load module for ssr: $${url}`) @@ -40,7 +43,7 @@ export async function ssrLoadModule( await Promise.all( result.deps!.map((dep) => { if (!isExternal(dep)) { - return ssrLoadModule(dep, server, urlStack.concat(url)) + return ssrLoadModule(dep, server, isolatedMode, urlStack.concat(url)) } }) ) @@ -70,7 +73,7 @@ export async function ssrLoadModule( if (isExternal(dep)) { return Promise.resolve(nodeRequire(dep, mod.file)) } else { - return ssrLoadModule(dep, server, urlStack.concat(url)) + return ssrLoadModule(dep, server, isolatedMode, urlStack.concat(url)) } }