fix(web): blank-screen hardening — stale chunk recovery, error boundary, no-cache index.html

- main.tsx: on vite:preloadError (stale index.html referencing removed
  hashed chunks after a redeploy) reload the page immediately.
- New ErrorBoundary around the whole router: render errors show a Persian
  fallback with «تلاش مجدد» instead of wiping the DOM.
- nginx: index.html served with Cache-Control no-cache,no-store,
  must-revalidate (verified live); /assets/* stays public, immutable.
This commit is contained in:
2026-09-06 19:03:27 +03:30
parent 4dd60d7cd9
commit 1f123a0a05
4 changed files with 67 additions and 3 deletions
+3 -2
View File
@@ -2,6 +2,7 @@ import { lazy, Suspense } from "react";
import { Navigate, Route, Routes } from "react-router-dom";
import { useAuthStore } from "./store/auth";
import { MobileTabBar } from "./components/layout/MobileTabBar";
import { ErrorBoundary } from "./components/ErrorBoundary";
// هر صفحه با React.lazy لود می‌شود (code splitting)
const DashboardPage = lazy(() =>
@@ -66,7 +67,7 @@ function HomeRoute() {
export default function App() {
return (
<>
<ErrorBoundary>
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/login" element={<LoginPage />} />
@@ -197,6 +198,6 @@ export default function App() {
</Routes>
</Suspense>
<MobileTabBar />
</>
</ErrorBoundary>
);
}