From 3de9c0b40809fd32af1fa193a4468e0c604dc144 Mon Sep 17 00:00:00 2001 From: waterWang <672684719@qq.com> Date: Sat, 22 Aug 2026 22:23:05 +0800 Subject: [PATCH 1/2] feat: add route-level code splitting with React.lazy and Suspense - Convert all 20 page imports to React.lazy() dynamic imports - Add Suspense wrapper with loading spinner (Loader2 from lucide-react) - Keep layout/utility components (EmployerLayout, ErrorBoundary, ErrorFallback) as regular imports since they are not route pages - Each page chunk loads on demand, reducing initial bundle size Closes #469 --- frontend/src/App.tsx | 429 ++++++++++++++++++++++--------------------- 1 file changed, 223 insertions(+), 206 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 35d47f8f..0ed2f325 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,30 +1,45 @@ -import { Routes, Route, Navigate } from 'react-router-dom'; +import { lazy, Suspense } from 'react'; +import { Routes, Route } from 'react-router-dom'; import { useEffect } from 'react'; -import Home from './pages/Home'; -import Debugger from './pages/Debugger'; -import PayrollScheduler from './pages/PayrollScheduler'; -import EmployeeEntry from './pages/EmployeeEntry'; +import { Loader2 } from 'lucide-react'; import EmployerLayout from './components/EmployerLayout'; -import HelpCenter from './pages/HelpCenter'; import ErrorBoundary from './components/ErrorBoundary'; import ErrorFallback from './components/ErrorFallback'; -import Settings from './pages/Settings'; -import WebhookSettings from './pages/WebhookSettings'; -import CustomReportBuilder from './pages/CustomReportBuilder'; -import CrossAssetPayment from './pages/CrossAssetPayment'; -import TransactionHistory from './pages/TransactionHistory'; -import AdminPanel from './pages/AdminPanel'; -import VestingEscrow from './pages/VestingEscrow'; -import RevenueSplitDashboard from './pages/RevenueSplitDashboard'; -import Forecasting from './pages/Forecasting'; -import TaxComplianceWizard from './pages/TaxComplianceWizard'; - -import EmployeePortal from './pages/EmployeePortal'; -import Login from './pages/Login'; -import AuthCallback from './pages/AuthCallback'; import { useTranslation } from 'react-i18next'; import { contractService } from './services/contracts'; +// Lazy-loaded page components for route-level code splitting +const Home = lazy(() => import('./pages/Home')); +const Debugger = lazy(() => import('./pages/Debugger')); +const PayrollScheduler = lazy(() => import('./pages/PayrollScheduler')); +const EmployeeEntry = lazy(() => import('./pages/EmployeeEntry')); +const HelpCenter = lazy(() => import('./pages/HelpCenter')); +const Settings = lazy(() => import('./pages/Settings')); +const WebhookSettings = lazy(() => import('./pages/WebhookSettings')); +const CustomReportBuilder = lazy(() => import('./pages/CustomReportBuilder')); +const CrossAssetPayment = lazy(() => import('./pages/CrossAssetPayment')); +const TransactionHistory = lazy(() => import('./pages/TransactionHistory')); +const AdminPanel = lazy(() => import('./pages/AdminPanel')); +const VestingEscrow = lazy(() => import('./pages/VestingEscrow')); +const RevenueSplitDashboard = lazy(() => import('./pages/RevenueSplitDashboard')); +const Forecasting = lazy(() => import('./pages/Forecasting')); +const TaxComplianceWizard = lazy(() => import('./pages/TaxComplianceWizard')); +const EmployeePortal = lazy(() => import('./pages/EmployeePortal')); +const Login = lazy(() => import('./pages/Login')); +const AuthCallback = lazy(() => import('./pages/AuthCallback')); +const NotFound = lazy(() => import('./pages/NotFound')); + +function PageLoader() { + return ( +
Loading…
+