Skip to content

Commit 6ecb148

Browse files
committed
generate fallback page before compressing - fixes #8971
1 parent 0abb8eb commit 6ecb148

File tree

5 files changed

+61
-51
lines changed

5 files changed

+61
-51
lines changed

.changeset/rich-llamas-knock.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/adapter-static': patch
3+
---
4+
5+
fix: generate fallback page before compressing

.changeset/thirty-ways-dress.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
chore: refactor fallback generation

packages/adapter-static/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ See https://kit.svelte.dev/docs/page-options#prerender for more details`
6464
builder.writePrerendered(pages);
6565

6666
if (fallback) {
67-
builder.generateFallback(path.join(pages, fallback));
67+
await builder.generateFallback(path.join(pages, fallback));
6868
}
6969

7070
if (precompress) {

packages/kit/src/core/adapt/builder.js

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { copy, rimraf, mkdirp } from '../../utils/filesystem.js';
99
import { generate_manifest } from '../generate_manifest/index.js';
1010
import { get_route_segments } from '../../utils/routing.js';
1111
import { get_env } from '../../exports/vite/utils.js';
12+
import generate_fallback from '../postbuild/fallback.js';
13+
import { write } from '../sync/utils.js';
1214

1315
const pipe = promisify(pipeline);
1416

@@ -142,31 +144,16 @@ export function create_builder({
142144
}
143145
},
144146

145-
generateFallback(dest) {
146-
// do prerendering in a subprocess so any dangling stuff gets killed upon completion
147-
const script = fileURLToPath(new URL('../postbuild/fallback.js', import.meta.url));
148-
147+
async generateFallback(dest) {
149148
const manifest_path = `${config.kit.outDir}/output/server/manifest-full.js`;
150-
151149
const env = get_env(config.kit.env, 'production');
152150

153-
return new Promise((fulfil, reject) => {
154-
const child = fork(
155-
script,
156-
[dest, manifest_path, JSON.stringify({ ...env.private, ...env.public })],
157-
{
158-
stdio: 'inherit'
159-
}
160-
);
161-
162-
child.on('exit', (code) => {
163-
if (code) {
164-
reject(new Error(`Could not create a fallback page — failed with code ${code}`));
165-
} else {
166-
fulfil(undefined);
167-
}
168-
});
151+
const fallback = await generate_fallback({
152+
manifest_path,
153+
env: { ...env.private, ...env.public }
169154
});
155+
156+
write(dest, fallback);
170157
},
171158

172159
generateManifest: ({ relativePath, routes: subset }) => {
@@ -223,6 +210,8 @@ export function create_builder({
223210
* @param {'gz' | 'br'} format
224211
*/
225212
async function compress_file(file, format = 'gz') {
213+
console.log(`compress ${file} ${format}`);
214+
226215
const compress =
227216
format == 'br'
228217
? zlib.createBrotliCompress({
Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,54 @@
1-
import { readFileSync, writeFileSync } from 'node:fs';
2-
import { dirname, join } from 'node:path';
1+
import { readFileSync } from 'node:fs';
2+
import { join } from 'node:path';
33
import { pathToFileURL } from 'node:url';
4-
import { mkdirp } from '../../utils/filesystem.js';
54
import { installPolyfills } from '../../exports/node/polyfills.js';
65
import { load_config } from '../config/index.js';
6+
import { forked } from '../../utils/fork.js';
77

8-
const [, , dest, manifest_path, env] = process.argv;
8+
export default forked(import.meta.url, generate_fallback);
99

10-
/** @type {import('types').ValidatedKitConfig} */
11-
const config = (await load_config()).kit;
10+
/**
11+
* @param {{
12+
* manifest_path: string;
13+
* env: Record<string, string>
14+
* }} opts
15+
*/
16+
async function generate_fallback({ manifest_path, env }) {
17+
/** @type {import('types').ValidatedKitConfig} */
18+
const config = (await load_config()).kit;
1219

13-
installPolyfills();
20+
installPolyfills();
1421

15-
const server_root = join(config.outDir, 'output');
22+
const server_root = join(config.outDir, 'output');
1623

17-
/** @type {import('types').ServerInternalModule} */
18-
const { set_building } = await import(pathToFileURL(`${server_root}/server/internal.js`).href);
24+
/** @type {import('types').ServerInternalModule} */
25+
const { set_building } = await import(pathToFileURL(`${server_root}/server/internal.js`).href);
1926

20-
/** @type {import('types').ServerModule} */
21-
const { Server } = await import(pathToFileURL(`${server_root}/server/index.js`).href);
27+
/** @type {import('types').ServerModule} */
28+
const { Server } = await import(pathToFileURL(`${server_root}/server/index.js`).href);
2229

23-
/** @type {import('types').SSRManifest} */
24-
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
30+
/** @type {import('types').SSRManifest} */
31+
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;
2532

26-
set_building(true);
33+
set_building(true);
2734

28-
const server = new Server(manifest);
29-
await server.init({ env: JSON.parse(env) });
35+
const server = new Server(manifest);
36+
await server.init({ env });
3037

31-
const rendered = await server.respond(new Request(config.prerender.origin + '/[fallback]'), {
32-
getClientAddress: () => {
33-
throw new Error('Cannot read clientAddress during prerendering');
34-
},
35-
prerendering: {
36-
fallback: true,
37-
dependencies: new Map()
38-
},
39-
read: (file) => readFileSync(join(config.files.assets, file))
40-
});
38+
const response = await server.respond(new Request(config.prerender.origin + '/[fallback]'), {
39+
getClientAddress: () => {
40+
throw new Error('Cannot read clientAddress during prerendering');
41+
},
42+
prerendering: {
43+
fallback: true,
44+
dependencies: new Map()
45+
},
46+
read: (file) => readFileSync(join(config.files.assets, file))
47+
});
4148

42-
mkdirp(dirname(dest));
43-
writeFileSync(dest, await rendered.text());
49+
if (response.ok) {
50+
return await response.text();
51+
}
52+
53+
throw new Error(`Could not create a fallback page — failed with status ${response.status}`);
54+
}

0 commit comments

Comments
 (0)