diff --git a/CHANGELOG.md b/CHANGELOG.md index 404e8084..3caf157b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to ## [Unreleased] +### Fixed + +- ✨(frontend) recover from stale lazy-loaded chunks after a deploy + ## [1.26.0] - 2026-08-12 ### Added diff --git a/src/frontend/src/main.tsx b/src/frontend/src/main.tsx index ed319314..75661d2d 100644 --- a/src/frontend/src/main.tsx +++ b/src/frontend/src/main.tsx @@ -2,6 +2,26 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.tsx' +const CHUNK_RELOAD_KEY = 'vite-preload-error-reload-at' +const RELOAD_COOLDOWN_MS = 30_000 + +window.addEventListener('vite:preloadError', (event) => { + try { + const lastReloadAt = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0 + if (Date.now() - lastReloadAt <= RELOAD_COOLDOWN_MS) { + // Recent reload didn't help: not a stale deploy, surface the error. + return + } + sessionStorage.setItem(CHUNK_RELOAD_KEY, String(Date.now())) + } catch { + // Without sessionStorage we cannot guard against a reload loop: + // don't auto-reload, let the error propagate. + return + } + event.preventDefault() + window.location.reload() +}) + ReactDOM.createRoot(document.getElementById('root')!).render(