Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/loose-parks-exist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: avoid running the `init` hook during builds if there's nothing to prerender
24 changes: 18 additions & 6 deletions packages/kit/src/core/postbuild/prerender.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import * as devalue from 'devalue';
import { createReadableStream } from '@sveltejs/kit/node';
import generate_fallback from './fallback.js';
import { stringify_remote_arg } from '../../runtime/shared.js';
import { filter_env } from '../../utils/env.js';

export default forked(import.meta.url, prerender);

Expand Down Expand Up @@ -125,12 +126,6 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {

installPolyfills();

const server = new Server(manifest);
await server.init({
env,
read: (file) => createReadableStream(`${config.outDir}/output/server/${file}`)
});

/** @type {Map<string, string>} */
const saved = new Map();

Expand Down Expand Up @@ -489,6 +484,15 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
}
}

// the user's remote function modules may reference environment variables at
// the top-level so we need to set `env` before evaluating those modules
// to avoid potential runtime errors
const { publicPrefix: public_prefix, privatePrefix: private_prefix } = config.env;
const private_env = filter_env(env, private_prefix, public_prefix);
const public_env = filter_env(env, public_prefix, private_prefix);
internal.set_private_env(private_env);
internal.set_public_env(public_env);

/** @type {Array<import('types').RemoteInfo & { type: 'prerender'}>} */
const prerender_functions = [];

Expand All @@ -507,6 +511,14 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
return { prerendered, prerender_map };
}

// only run the server after the `should_prerender` check so that we
// don't run the user's init hook unnecessarily
const server = new Server(manifest);
await server.init({
env,
read: (file) => createReadableStream(`${config.outDir}/output/server/${file}`)
});

log.info('Prerendering');

for (const entry of config.prerender.entries) {
Expand Down
9 changes: 9 additions & 0 deletions packages/kit/test/apps/options/source/hooks.server.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { building } from '$app/environment';
import { env } from '$env/dynamic/private';

// this verifies that dynamic env vars can be read during analysis phase
Expand All @@ -13,3 +14,11 @@ export function handle({ event, resolve }) {
preload: ({ type }) => type !== 'css'
});
}

export function init() {
if (building) {
throw new Error(
'There are no prerendered pages or functions in this app so init() should not be called during the build'
);
}
}
Loading