diff --git a/.changeset/wise-garlics-bathe.md b/.changeset/wise-garlics-bathe.md new file mode 100644 index 000000000000..1f041ca25425 --- /dev/null +++ b/.changeset/wise-garlics-bathe.md @@ -0,0 +1,6 @@ +--- +'astro': patch +'@astrojs/preact': patch +--- + +Fix `isSelfAccepting` errors when using the Preact integration with the Astro dev server diff --git a/packages/astro/src/core/render/dev/index.ts b/packages/astro/src/core/render/dev/index.ts index 0cf909caf86d..d16cb8923aa2 100644 --- a/packages/astro/src/core/render/dev/index.ts +++ b/packages/astro/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 }; } diff --git a/packages/integrations/preact/package.json b/packages/integrations/preact/package.json index c6b705750030..fd8d4b1b71b9 100644 --- a/packages/integrations/preact/package.json +++ b/packages/integrations/preact/package.json @@ -20,9 +20,7 @@ "homepage": "https://astro.build", "exports": { ".": "./dist/index.js", - "./client": "./client", "./client.js": "./client.js", - "./server": "./server", "./server.js": "./server.js", "./package.json": "./package.json" }, diff --git a/packages/integrations/preact/src/index.ts b/packages/integrations/preact/src/index.ts index 113284c31372..c96bf1190b48 100644 --- a/packages/integrations/preact/src/index.ts +++ b/packages/integrations/preact/src/index.ts @@ -3,8 +3,8 @@ import { AstroIntegration } from 'astro'; function getRenderer() { return { name: '@astrojs/preact', - clientEntrypoint: '@astrojs/preact/client', - serverEntrypoint: '@astrojs/preact/server', + clientEntrypoint: '@astrojs/preact/client.js', + serverEntrypoint: '@astrojs/preact/server.js', jsxImportSource: 'preact', jsxTransformOptions: async () => { const { @@ -21,8 +21,8 @@ function getRenderer() { function getViteConfiguration() { return { optimizeDeps: { - include: ['@astrojs/preact/client', 'preact', 'preact/jsx-runtime', 'preact-render-to-string'], - exclude: ['@astrojs/preact/server'], + include: ['@astrojs/preact/client.js', 'preact', 'preact/jsx-runtime', 'preact-render-to-string'], + exclude: ['@astrojs/preact/server.js'], }, ssr: { external: ['preact-render-to-string'],