diff --git a/.changeset/tidy-tips-doubt.md b/.changeset/tidy-tips-doubt.md new file mode 100644 index 000000000..e0a38c69e --- /dev/null +++ b/.changeset/tidy-tips-doubt.md @@ -0,0 +1,5 @@ +--- +'@astrojs/vercel': minor +--- + +Add cache headers to assets in Vercel adapter diff --git a/packages/integrations/vercel/src/edge/adapter.ts b/packages/integrations/vercel/src/edge/adapter.ts index 5af00dfce..b83c9f2b7 100644 --- a/packages/integrations/vercel/src/edge/adapter.ts +++ b/packages/integrations/vercel/src/edge/adapter.ts @@ -154,6 +154,11 @@ export default function vercelEdge({ version: 3, routes: [ ...getRedirects(routes, _config), + { + src: `^/${_config.build.assets}/(.*)$`, + headers: { 'cache-control': 'public, max-age=31536000, immutable' }, + continue: true, + }, { handle: 'filesystem' }, { src: '/.*', dest: 'render' }, ], diff --git a/packages/integrations/vercel/src/serverless/adapter.ts b/packages/integrations/vercel/src/serverless/adapter.ts index 2d12db5ad..1a2f9d82a 100644 --- a/packages/integrations/vercel/src/serverless/adapter.ts +++ b/packages/integrations/vercel/src/serverless/adapter.ts @@ -187,7 +187,16 @@ export default function vercelServerless({ // https://vercel.com/docs/build-output-api/v3#build-output-configuration await writeJson(new URL(`./config.json`, _config.outDir), { version: 3, - routes: [...getRedirects(routes, _config), { handle: 'filesystem' }, ...routeDefinitions], + routes: [ + ...getRedirects(routes, _config), + { + src: `^/${_config.build.assets}/(.*)$`, + headers: { 'cache-control': 'public, max-age=31536000, immutable' }, + continue: true, + }, + { handle: 'filesystem' }, + ...routeDefinitions, + ], ...(imageService || imagesConfig ? { images: imagesConfig ? imagesConfig : defaultImageConfig } : {}), diff --git a/packages/integrations/vercel/src/static/adapter.ts b/packages/integrations/vercel/src/static/adapter.ts index f710356aa..bc83b24af 100644 --- a/packages/integrations/vercel/src/static/adapter.ts +++ b/packages/integrations/vercel/src/static/adapter.ts @@ -71,7 +71,15 @@ export default function vercelStatic({ // https://vercel.com/docs/build-output-api/v3#build-output-configuration await writeJson(new URL(`./config.json`, getVercelOutput(_config.root)), { version: 3, - routes: [...getRedirects(routes, _config), { handle: 'filesystem' }], + routes: [ + ...getRedirects(routes, _config), + { + src: `^/${_config.build.assets}/(.*)$`, + headers: { 'cache-control': 'public, max-age=31536000, immutable' }, + continue: true, + }, + { handle: 'filesystem' }, + ], ...(imageService || imagesConfig ? { images: imagesConfig ? imagesConfig : defaultImageConfig } : {}), diff --git a/packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs b/packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs new file mode 100644 index 000000000..20b0b8e2b --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs @@ -0,0 +1,4 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({ +}); diff --git a/packages/integrations/vercel/test/fixtures/static-assets/package.json b/packages/integrations/vercel/test/fixtures/static-assets/package.json new file mode 100644 index 000000000..e1b608a85 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/static-assets/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/astro-vercel-static-assets", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/vercel": "workspace:*", + "astro": "workspace:*" + } +} diff --git a/packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro new file mode 100644 index 000000000..9c077e2a3 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro @@ -0,0 +1,8 @@ + +
+