From 22071b344a55deedafdb8635d88198712366f31b Mon Sep 17 00:00:00 2001 From: Milton Gonzalez Date: Wed, 21 Oct 2026 08:34:18 -0500 Subject: [PATCH] fix: version 2.18.3 -- F5 normal ya no muestra la version anterior tras actualizar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El service worker servia index.html desde su precache en cada navegacion. Navegaciones pasan a NetworkFirst (cache solo offline), serve.json agrega no-cache a html/sw.js e immutable a /assets, y se chequean actualizaciones del SW cada 30 min y al volver a la pestaña. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 9 +++++++++ VERSION | 2 +- backend/package.json | 2 +- frontend/package.json | 2 +- frontend/public/serve.json | 16 ++++++++++++++++ frontend/src/main.jsx | 12 +++++++++++- frontend/vite.config.js | 13 +++++++++++++ 7 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 frontend/public/serve.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d960e13..c907474 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog - project.linkedcorp.net +## [2.18.3] - 2026-10-21 +### Fixed +- Después de una actualización, un F5 normal (sin Ctrl) mostraba la versión anterior hasta la + recarga siguiente: el service worker servía el index.html viejo de su caché. Ahora la página + siempre se pide al servidor primero (la caché solo se usa sin conexión), `index.html`/`sw.js` + se sirven con `Cache-Control: no-cache` (nuevo `serve.json`), y la app revisa si hay versión + nueva cada 30 min y al volver a la pestaña. Los navegadores que tengan la versión vieja del + service worker necesitan una recarga más (la última) para tomar este cambio. + ## [2.18.2] - 2026-10-21 ### Removed - Panel: se quita el bloque "Mis actividades pendientes" (el detalle ya se ve en el popup de diff --git a/VERSION b/VERSION index 61dc334..2645281 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.18.2 +2.18.3 diff --git a/backend/package.json b/backend/package.json index 962629a..ef191c1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "project-linkedcorp-backend", - "version": "2.18.2", + "version": "2.18.3", "private": true, "type": "module", "main": "src/server.js", diff --git a/frontend/package.json b/frontend/package.json index 947f686..5373c77 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "project-linkedcorp-frontend", "private": true, - "version": "2.18.2", + "version": "2.18.3", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/public/serve.json b/frontend/public/serve.json new file mode 100644 index 0000000..559e662 --- /dev/null +++ b/frontend/public/serve.json @@ -0,0 +1,16 @@ +{ + "headers": [ + { + "source": "**/*.@(html|webmanifest)", + "headers": [{ "key": "Cache-Control", "value": "no-cache" }] + }, + { + "source": "@(sw.js|registerSW.js|workbox-*.js)", + "headers": [{ "key": "Cache-Control", "value": "no-cache" }] + }, + { + "source": "assets/**", + "headers": [{ "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }] + } + ] +} diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 41ab7b6..c7453ab 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -9,7 +9,17 @@ import './styles/app.css'; installGlobalErrorReporter(); // autoUpdate: toma la version nueva del service worker sola en cuanto esta lista, sin pedirle // nada al usuario (no hay riesgo de mostrar una version vieja de la UI por mucho tiempo). -registerSW({ immediate: true }); +registerSW({ + immediate: true, + // Ademas de al cargar, revisa si hay version nueva cada 30 min y al volver a la pestaña -- + // asi una pestaña abierta todo el dia no se queda en la version anterior. + onRegisteredSW(_url, registration) { + if (!registration) return; + const check = () => registration.update().catch(() => {}); + setInterval(check, 30 * 60 * 1000); + document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') check(); }); + }, +}); // skipWaiting+clientsClaim (activados por autoUpdate) hacen que el service worker nuevo tome // control solo, pero eso NO refresca la pagina ya abierta -- el usuario seguia viendo JS/CSS diff --git a/frontend/vite.config.js b/frontend/vite.config.js index f5e8878..2657743 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -31,6 +31,19 @@ export default defineConfig({ // index.html cacheado) queda excluido de /api de forma explicita, aunque de por si esas // llamadas no son navegaciones de pagina. navigateFallbackDenylist: [/^\/api\//], + // index.html NUNCA sale del precache en una navegacion: si no, un F5 (sin Ctrl) mostraba + // la version vieja hasta la recarga siguiente. Las navegaciones van a la red primero + // (con 3 s de espera) y solo usan cache si no hay conexion. Los JS/CSS siguen + // precacheados: llevan hash en el nombre, asi que nunca se mezclan versiones. + navigateFallback: null, + runtimeCaching: [ + { + urlPattern: ({ request, url }) => request.mode === 'navigate' && !url.pathname.startsWith('/api/'), + handler: 'NetworkFirst', + options: { cacheName: 'pages', networkTimeoutSeconds: 3 }, + }, + ], + cleanupOutdatedCaches: true, }, }), ],