From 072c9dc934fd886e45ed812a47af14c8eadaffed Mon Sep 17 00:00:00 2001 From: vikingowl Date: Sun, 22 Feb 2026 19:24:18 +0100 Subject: [PATCH] feat: add version polling and auto-reload on deploy - Enable kit.version.pollInterval (60s) so SvelteKit detects new deploys via version.json - Add beforeNavigate guard that forces a full page reload when a new version is detected, preventing stale client-side state - Preload fonts, JS, and CSS for faster initial paint --- web/src/hooks.server.ts | 4 +++- web/src/routes/+layout.svelte | 8 ++++++++ web/svelte.config.js | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/web/src/hooks.server.ts b/web/src/hooks.server.ts index 19f0778..9c26dff 100644 --- a/web/src/hooks.server.ts +++ b/web/src/hooks.server.ts @@ -54,5 +54,7 @@ export const handle: Handle = async ({ event, resolve }) => { } } - return resolve(event); + return resolve(event, { + preload: ({ type }) => type === 'font' || type === 'js' || type === 'css' + }); }; diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte index 7dd4c4f..b2afdea 100644 --- a/web/src/routes/+layout.svelte +++ b/web/src/routes/+layout.svelte @@ -3,6 +3,8 @@ import Header from '$lib/components/layout/Header.svelte'; import Footer from '$lib/components/layout/Footer.svelte'; import { page } from '$app/stores'; + import { updated } from '$app/stores'; + import { beforeNavigate } from '$app/navigation'; import type { Snippet } from 'svelte'; interface Props { @@ -13,6 +15,12 @@ let { data, children }: Props = $props(); const canonicalUrl = $derived(`https://marktvogt.de${$page.url.pathname}`); + + beforeNavigate(({ willUnload, to }) => { + if ($updated && !willUnload && to?.url) { + location.href = to.url.href; + } + }); diff --git a/web/svelte.config.js b/web/svelte.config.js index 6bfb3c4..3e90abb 100644 --- a/web/svelte.config.js +++ b/web/svelte.config.js @@ -3,7 +3,10 @@ import adapter from '@sveltejs/adapter-node'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { - adapter: adapter() + adapter: adapter(), + version: { + pollInterval: 60_000 + } } };