From f28d823d5ebfb27c02438285500f4464fac90593 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 23 May 2022 22:18:56 -0400 Subject: [PATCH] only serve _app/build with immutable cache header, not _app/version.json - fixes #4837 --- .changeset/wise-berries-flash.md | 10 ++++++++ .../adapter-cloudflare-workers/files/entry.js | 2 +- packages/adapter-cloudflare/src/worker.js | 2 +- packages/adapter-netlify/src/edge.js | 3 ++- packages/adapter-node/src/handler.js | 23 +++++++++++-------- packages/adapter-vercel/index.js | 2 +- 6 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 .changeset/wise-berries-flash.md diff --git a/.changeset/wise-berries-flash.md b/.changeset/wise-berries-flash.md new file mode 100644 index 000000000000..0e72e7394437 --- /dev/null +++ b/.changeset/wise-berries-flash.md @@ -0,0 +1,10 @@ +--- +'@sveltejs/adapter-cloudflare': patch +'@sveltejs/adapter-cloudflare-workers': patch +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-node': patch +'@sveltejs/adapter-vercel': patch +'@sveltejs/kit': patch +--- + +only serve \_app/build with immutable cache header, not \_app/version.json diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 2d2a5d32c0cf..2efd905e45f3 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -6,7 +6,7 @@ const static_asset_manifest = JSON.parse(static_asset_manifest_json); const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const prefix = `/${manifest.appDir}/build/`; export default { /** diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index ad7c4643034d..5c385749e667 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -4,7 +4,7 @@ import * as Cache from 'worktop/cfw.cache'; const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const prefix = `/${manifest.appDir}/build/`; /** @type {import('worktop/cfw').Module.Worker<{ ASSETS: import('worktop/cfw.durable').Durable.Object }>} */ const worker = { diff --git a/packages/adapter-netlify/src/edge.js b/packages/adapter-netlify/src/edge.js index 89d2eb7e58ec..adf7dee8a9b7 100644 --- a/packages/adapter-netlify/src/edge.js +++ b/packages/adapter-netlify/src/edge.js @@ -2,7 +2,7 @@ import { Server } from '0SERVER'; import { manifest, prerendered } from 'MANIFEST'; const server = new Server(manifest); -const prefix = `/${manifest.appDir}/`; +const prefix = `/${manifest.appDir}/build/`; /** * @param { Request } request @@ -12,6 +12,7 @@ const prefix = `/${manifest.appDir}/`; export default function handler(request, context) { if (is_static_file(request)) { // Static files can skip the handler + // TODO can we serve _app/build files with an immutable cache header? return; } diff --git a/packages/adapter-node/src/handler.js b/packages/adapter-node/src/handler.js index d5c66d920b15..e68ed88b3b22 100644 --- a/packages/adapter-node/src/handler.js +++ b/packages/adapter-node/src/handler.js @@ -22,18 +22,23 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); /** * @param {string} path - * @param {number} max_age - * @param {boolean} immutable + * @param {boolean} client */ -function serve(path, max_age, immutable = false) { +function serve(path, client = false) { return ( fs.existsSync(path) && sirv(path, { etag: true, - maxAge: max_age, - immutable, gzip: true, - brotli: true + brotli: true, + setHeaders: + client && + ((res, pathname) => { + // only apply to build directory, not e.g. version.json + if (pathname.startsWith(`/${manifest.appDir}/build/`)) { + res.setHeader('cache-control', 'public,max-age=31536000,immutable'); + } + }) }) ); } @@ -126,9 +131,9 @@ function get_origin(headers) { export const handler = sequence( [ - serve(path.join(__dirname, '/client'), 31536000, true), - serve(path.join(__dirname, '/static'), 0), - serve(path.join(__dirname, '/prerendered'), 0), + serve(path.join(__dirname, '/client'), true), + serve(path.join(__dirname, '/static')), + serve(path.join(__dirname, '/prerendered')), ssr ].filter(Boolean) ); diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 041f492557fa..37d0d7dda9a8 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -180,7 +180,7 @@ async function v1(builder, external) { ...prerendered_pages, ...prerendered_redirects, { - src: `/${builder.config.kit.appDir}/.+`, + src: `/${builder.config.kit.appDir}/build/.+`, headers: { 'cache-control': 'public, immutable, max-age=31536000' }