From 44f30589c5f5bdfcac8e94837c8fc428b7f3ffbd Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 6 Jan 2023 17:28:00 -0500 Subject: [PATCH] only prerender a given dependency once - closes #3784 --- .changeset/breezy-walls-provide.md | 5 +++++ packages/kit/src/core/prerender/prerender.js | 16 +++++++++++++++- .../fetch-endpoint/also-not-buffered/+page.js | 9 +++++++++ .../also-not-buffered/+page.svelte | 6 ++++++ .../fetch-endpoint/not-buffered.json/+server.js | 5 +++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .changeset/breezy-walls-provide.md create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.svelte diff --git a/.changeset/breezy-walls-provide.md b/.changeset/breezy-walls-provide.md new file mode 100644 index 000000000000..28b778bfaef7 --- /dev/null +++ b/.changeset/breezy-walls-provide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +only prerender a given dependency once diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index aa3e732c6835..0e6f86306fda 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -102,10 +102,20 @@ export async function prerender() { /** @type {import('types').SSRManifest} */ const manifest = (await import(pathToFileURL(manifest_path).href)).manifest; + /** @type {Map} */ + const saved = new Map(); + override({ building: true, paths: config.paths, - read: (file) => readFileSync(join(config.files.assets, file)) + read: (file) => { + // stuff we just wrote + const filepath = saved.get(file); + if (filepath) return readFileSync(filepath); + + // stuff in `static` + return readFileSync(join(config.files.assets, file)); + } }); const server = new Server(manifest); @@ -222,6 +232,7 @@ export async function prerender() { } const body = result.body ?? new Uint8Array(await result.response.arrayBuffer()); + save( 'dependencies', result.response, @@ -351,6 +362,9 @@ export async function prerender() { } else if (response_type !== OK) { handle_http_error({ status: response.status, path: decoded, referrer, referenceType }); } + + manifest.assets.add(file); + saved.set(file, dest); } for (const route of manifest._.routes) { diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.js new file mode 100644 index 000000000000..de4123c2aafe --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const url = '/fetch-endpoint/not-buffered.json'; + const res = await fetch(url); + + return { + headers: res.headers + }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.svelte new file mode 100644 index 000000000000..bf73bfc65b89 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/also-not-buffered/+page.svelte @@ -0,0 +1,6 @@ + + +

content-type: {data.headers.get('content-type')}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js index 82d3cb7b8345..692b07ced2c6 100644 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js @@ -1,5 +1,10 @@ import { json } from '@sveltejs/kit'; +let called = false; + export async function GET() { + if (called) throw new Error('should only be called once'); + called = true; + return json({ answer: 42 }); }