A page from before a deploy can still find its chunks, or reload once
Sentry WIZWAR-5: a table open through a deploy asked for the replay module by its old hashed name, the deploy had deleted it, and the server answered with the app shell as text/html — "not a valid JavaScript MIME type". Three guards: deploys keep old chunks for a week instead of deleting them; a missing asset is a plain 404, never the shell; and the client reloads once when Vite reports a failed import, so the live bundle takes over. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
fa5a5a07a7
commit
0911312f98
@@ -7,6 +7,19 @@ if (import.meta.env.VITE_SENTRY_DSN) {
|
||||
Sentry.init({ dsn: import.meta.env.VITE_SENTRY_DSN, environment: "production" });
|
||||
}
|
||||
|
||||
// A page loaded before a deploy may ask for a chunk the deploy retired.
|
||||
// Vite reports the failed import here; one reload fetches the live bundle.
|
||||
// The flag keeps a broken build from reloading forever.
|
||||
window.addEventListener("vite:preloadError", (e) => {
|
||||
e.preventDefault();
|
||||
try {
|
||||
if (sessionStorage.getItem("wizwar-reloaded")) return;
|
||||
sessionStorage.setItem("wizwar-reloaded", "1");
|
||||
} catch { /* storage may be unavailable; reload anyway */ }
|
||||
location.reload();
|
||||
});
|
||||
try { sessionStorage.removeItem("wizwar-reloaded"); } catch { /* ignore */ }
|
||||
|
||||
// /watch/<id> is the public share page — one turn, anyone may look. It
|
||||
// loads its own component so the full app (and its live socket appetite)
|
||||
// stays out of a shared link's way.
|
||||
|
||||
Reference in New Issue
Block a user