ui: Remove PWA navigate fallback to prevent caching API endpoint requests (#25174)

This commit is contained in:
Aleksander Grygier
2026-07-01 07:32:55 +02:00
committed by GitHub
parent fd1a05791d
commit 7af4279f45
3 changed files with 18 additions and 10 deletions
+10 -7
View File
@@ -288,9 +288,7 @@ export const API_CACHING_PATTERNS = {
} as const; } as const;
// SvelteKit PWA plugin options // SvelteKit PWA plugin options
export const PWA_KIT_OPTIONS = { export const PWA_KIT_OPTIONS = {} as const;
NAVIGATE_FALLBACK: './'
} as const;
export const APPLE_META_TAGS = { export const APPLE_META_TAGS = {
MOBILE_WEB_APP_CAPABLE: { name: 'apple-mobile-web-app-capable', content: 'yes' }, MOBILE_WEB_APP_CAPABLE: { name: 'apple-mobile-web-app-capable', content: 'yes' },
@@ -322,6 +320,14 @@ export const SVELTEKIT_PWA_OPTIONS: SvelteKitPWAOptions = {
globIgnores: GLOB_IGNORES, globIgnores: GLOB_IGNORES,
maximumFileSizeToCacheInBytes: CACHE_SETTINGS.MAX_FILE_SIZE_BYTES, maximumFileSizeToCacheInBytes: CACHE_SETTINGS.MAX_FILE_SIZE_BYTES,
// Prevent @vite-pwa/sveltekit from auto-adding a NavigationRoute by
// setting navigateFallback to empty string. This keeps the service
// worker from intercepting direct browser navigation to server API
// endpoints (e.g. /slots, /models, /v1/models) which should return
// JSON, not the SPA HTML shell. The server's own static-file fallback
// handles non-API navigation to index.html for the SPA router.
navigateFallback: '',
// Runtime caching for API calls - use NetworkFirst so APIs are always fresh // Runtime caching for API calls - use NetworkFirst so APIs are always fresh
runtimeCaching: [ runtimeCaching: [
{ {
@@ -351,10 +357,7 @@ export const SVELTEKIT_PWA_OPTIONS: SvelteKitPWAOptions = {
devOptions: { devOptions: {
enabled: true, enabled: true,
suppressWarnings: true, suppressWarnings: true
// Use PWA_KIT_OPTIONS.NAVIGATE_FALLBACK to match production SW behaviour
// (navigateFallback defaults to the configured base path, which is '/' for this SPA).
navigateFallback: PWA_KIT_OPTIONS.NAVIGATE_FALLBACK
}, },
// SvelteKit-specific options // SvelteKit-specific options
+4 -1
View File
@@ -43,7 +43,10 @@ test.describe('PWA Service Worker', () => {
expect(swContent).toMatch(/"_app\/immutable\/assets\/bundle\.[a-zA-Z0-9_-]+\.css"/); expect(swContent).toMatch(/"_app\/immutable\/assets\/bundle\.[a-zA-Z0-9_-]+\.css"/);
expect(swContent).toMatch(/"manifest\.webmanifest"/); expect(swContent).toMatch(/"manifest\.webmanifest"/);
expect(swContent).toMatch(/"_app\/version\.json"/); expect(swContent).toMatch(/"_app\/version\.json"/);
expect(swContent).toMatch(/NavigationRoute/); // NavigationRoute is intentionally absent — server API endpoints
// (e.g. /slots, /models) must not be intercepted by the PWA and
// should return JSON directly from the server.
expect(swContent).not.toMatch(/NavigationRoute/);
expect(swContent).toMatch(/api-cache/); expect(swContent).toMatch(/api-cache/);
}); });
+4 -2
View File
@@ -108,9 +108,11 @@ describe('PWA Build Output', () => {
expect(swContent).toMatch(/"manifest\.webmanifest"/); expect(swContent).toMatch(/"manifest\.webmanifest"/);
}); });
it('has navigation route registered', () => { it('no navigation route — API endpoints bypass PWA', () => {
expect(swContent).toBeTruthy(); expect(swContent).toBeTruthy();
expect(swContent).toMatch(/NavigationRoute/); // NavigationRoute is intentionally absent so direct browser
// navigation to server API endpoints returns JSON, not HTML.
expect(swContent).not.toMatch(/NavigationRoute/);
}); });
it('has runtime caching for API routes', () => { it('has runtime caching for API routes', () => {