diff --git a/.changeset/curly-mails-lie.md b/.changeset/curly-mails-lie.md new file mode 100644 index 000000000000..70f57323fd3d --- /dev/null +++ b/.changeset/curly-mails-lie.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix dev routing for `server:defer` islands when adapters opt into handling prerendered routes in Astro core. Server island requests are now treated as prerender-handler eligible so prerendered pages using `prerenderEnvironment: 'node'` can load island content without `400` errors. diff --git a/packages/astro/src/vite-plugin-astro-server/plugin.ts b/packages/astro/src/vite-plugin-astro-server/plugin.ts index f4866f99b5a0..89ff91b5a53e 100644 --- a/packages/astro/src/vite-plugin-astro-server/plugin.ts +++ b/packages/astro/src/vite-plugin-astro-server/plugin.ts @@ -22,7 +22,7 @@ import { AstroError, AstroErrorData } from '../core/errors/index.js'; import type { Logger } from '../core/logger/core.js'; import { NOOP_MIDDLEWARE_FN } from '../core/middleware/noop-middleware.js'; import { createViteLoader } from '../core/module-loader/index.js'; -import { matchAllRoutes } from '../core/routing/match.js'; +import { isRouteServerIsland, matchAllRoutes } from '../core/routing/match.js'; import { resolveMiddlewareMode } from '../integrations/adapter-utils.js'; import { SERIALIZED_MANIFEST_ID } from '../manifest/serialized.js'; import type { AstroSettings } from '../types/astro.js'; @@ -176,7 +176,7 @@ export default function createVitePluginAstroServer({ const routesList = { routes: routes.map((r: any) => r.routeData) }; const matches = matchAllRoutes(pathname, routesList); - if (!matches.some((route) => route.prerender)) { + if (!matches.some((route) => route.prerender || isRouteServerIsland(route))) { return next(); } diff --git a/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/components/DeferredIsland.astro b/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/components/DeferredIsland.astro new file mode 100644 index 000000000000..406b874edfe6 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/components/DeferredIsland.astro @@ -0,0 +1 @@ +
deferred island content
diff --git a/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/pages/index.astro index 92c69edf9b55..fb8441836b45 100644 --- a/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/pages/index.astro +++ b/packages/integrations/cloudflare/test/fixtures/prerender-node-env/src/pages/index.astro @@ -3,6 +3,7 @@ export const prerender = true; import fs from 'node:fs'; import path from 'node:path'; +import DeferredIsland from '../components/DeferredIsland.astro'; const packageJsonPath = path.join(process.cwd(), 'package.json'); const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); @@ -20,5 +21,8 @@ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));{packageJson.name}
+loading...
+