summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/wise-garlics-bathe.md6
-rw-r--r--packages/astro/src/core/render/dev/index.ts18
-rw-r--r--packages/integrations/preact/package.json2
-rw-r--r--packages/integrations/preact/src/index.ts8
4 files changed, 15 insertions, 19 deletions
diff --git a/.changeset/wise-garlics-bathe.md b/.changeset/wise-garlics-bathe.md
new file mode 100644
index 000000000..1f041ca25
--- /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 0cf909caf..d16cb8923 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<string, SSRLoadedRenderer['ssr']>();
async function loadRenderer(viteServer: vite.ViteDevServer, renderer: AstroRenderer): Promise<SSRLoadedRenderer> {
- 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 c6b705750..fd8d4b1b7 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 113284c31..c96bf1190 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'],