From d2dd305741ec4a4cd4f7fcd63867a0c26407dabc Mon Sep 17 00:00:00 2001 From: Ben Holmes Date: Thu, 24 Mar 2022 12:28:50 -0400 Subject: [PATCH] Fix: `is self accepting` pt 2 module graph boogaloo (#2872) * fix: isSelfAccepting Preact error * refactor: add .js ext to preact entrypoints for consistency * chore: changeset * fix: remove ./client and ./server from preact pkg exp --- src/core/render/dev/index.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/core/render/dev/index.ts b/src/core/render/dev/index.ts index 0cf909caf86d..d16cb8923aa2 100644 --- a/src/core/render/dev/index.ts +++ b/src/core/render/dev/index.ts @@ -40,21 +40,13 @@ export type ComponentPreload = [SSRLoadedRenderer[], ComponentInstance]; export type RenderResponse = { type: 'html'; html: string } | { type: 'response'; response: Response }; const svelteStylesRE = /svelte\?svelte&type=style/; -// Cache renderers to avoid re-resolving the module using Vite's `ssrLoadModule` -// This prevents an odd exception trying to resolve the same server-side module -// Multiple times. See `isSelfAccepting` issue: https://github.com/withastro/astro/pull/2852 -const rendererCache = new Map(); async function loadRenderer(viteServer: vite.ViteDevServer, renderer: AstroRenderer): Promise { - const { url } = await viteServer.moduleGraph.ensureEntryFromUrl(renderer.serverEntrypoint); - - const cachedRenderer = rendererCache.get(url); - if (cachedRenderer) { - return { ...renderer, ssr: cachedRenderer }; - } - - const mod = (await viteServer.ssrLoadModule(url)) as { default: SSRLoadedRenderer['ssr'] }; - rendererCache.set(url, mod.default); + // Vite modules can be out-of-date when using an un-resolved url + // We also encountered inconsistencies when using the resolveUrl and resolveId helpers + // We've found that pulling the ID directly from the urlToModuleMap is the most stable! + const id = viteServer.moduleGraph.urlToModuleMap.get(renderer.serverEntrypoint)?.id ?? renderer.serverEntrypoint; + const mod = (await viteServer.ssrLoadModule(id)) as { default: SSRLoadedRenderer['ssr'] }; return { ...renderer, ssr: mod.default }; }