22071b344a
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 <noreply@anthropic.com>
42 lines
1.7 KiB
React
42 lines
1.7 KiB
React
import React from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import { registerSW } from 'virtual:pwa-register';
|
|
import App from './app/App.jsx';
|
|
import { installGlobalErrorReporter } from './utils/errorReporter.js';
|
|
import './styles/tokens.css';
|
|
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,
|
|
// 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
|
|
// viejo hasta un F5 manual. Con esto, en cuanto el nuevo SW toma control, se refresca sola una
|
|
// vez (la bandera evita un loop si el evento dispara mas de una vez).
|
|
if ('serviceWorker' in navigator) {
|
|
let reloaded = false;
|
|
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
|
if (reloaded) return;
|
|
reloaded = true;
|
|
window.location.reload();
|
|
});
|
|
}
|
|
|
|
ReactDOM.createRoot(document.getElementById('root')).render(
|
|
<React.StrictMode>
|
|
<App />
|
|
</React.StrictMode>
|
|
);
|