From 41edc89ac76b2b5048d78888b54ff1c73bb4b6a6 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Thu, 11 Dec 2025 14:30:19 +0800 Subject: [PATCH] fix(pwa): don't cache api requests and cache client-side navigation routes (#2687) --- apps/readest-app/next.config.mjs | 34 +++++++++++++++++++++++++++++++- apps/readest-app/package.json | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/apps/readest-app/next.config.mjs b/apps/readest-app/next.config.mjs index bb2ac102..64636015 100644 --- a/apps/readest-app/next.config.mjs +++ b/apps/readest-app/next.config.mjs @@ -83,7 +83,39 @@ const withPWA = pwaDisabled disableDevLogs: true, runtimeCaching: [ { - urlPattern: /^https?.*/, + urlPattern: ({ url, request }) => { + const clientRoutes = ['/library', '/reader']; + const isClientRoute = clientRoutes.some((route) => url.pathname.startsWith(route)); + return isClientRoute && request.mode === 'navigate'; + }, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'pages-cache', + expiration: { + maxAgeSeconds: 365 * 24 * 60 * 60, + }, + cacheableResponse: { + statuses: [0, 200], + }, + plugins: [ + { + cacheKeyWillBeUsed: async ({ request }) => { + const url = new URL(request.url); + const basePath = url.pathname.split('/')[1]; + const cacheKey = `${url.origin}/${basePath}`; + return cacheKey; + }, + }, + ], + }, + }, + { + urlPattern: ({ url }) => { + if (url.pathname.startsWith('/api/')) { + return false; + } + return /^https?.*/.test(url.href); + }, handler: 'StaleWhileRevalidate', options: { cacheName: 'offlineCache', diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json index 56c33d01..edc94816 100644 --- a/apps/readest-app/package.json +++ b/apps/readest-app/package.json @@ -37,7 +37,7 @@ "release-ios-appstore": "dotenv -e .env.ios-appstore.local -- bash scripts/release-ios-appstore.sh", "release-google-play": "dotenv -e .env.google-play.local -- bash scripts/release-google-play.sh", "config-wrangler": "sed -i \"s/\\${TRANSLATIONS_KV_ID}/$TRANSLATIONS_KV_ID/g\" wrangler.toml", - "preview": "pnpm patch-build-webpack && NEXT_PUBLIC_APP_PLATFORM=web opennextjs-cloudflare build && pnpm restore-build-original && opennextjs-cloudflare preview --ip 0.0.0.0", + "preview": "pnpm patch-build-webpack && NEXT_PUBLIC_APP_PLATFORM=web opennextjs-cloudflare build && pnpm restore-build-original && opennextjs-cloudflare preview --ip 0.0.0.0 --port 3001", "deploy": "pnpm patch-build-webpack && NEXT_PUBLIC_APP_PLATFORM=web opennextjs-cloudflare build && pnpm restore-build-original && opennextjs-cloudflare deploy", "upload": "pnpm patch-build-webpack && NEXT_PUBLIC_APP_PLATFORM=web opennextjs-cloudflare build && pnpm restore-build-original && opennextjs-cloudflare upload", "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts",