/** * Admin 后台 - 路由配置 * * 所有 Admin 页面的路由定义,使用嵌套路由。 * 挂载路径: /admin/* * * 全部页面采用 `lazy` 动态导入。 * * 此前这里是 10 个静态 import:App.tsx 引入 adminRoutes 就把 * Dashboard/Collection/Logs/Eval/Backtest/Settings/Monitoring/ * DataCompleteness/DataPipeline/PredictionHistory 连同它们的 * 数据访问层一次性拉进首屏 —— 一个只想看赛程的匿名访客, * 要为完整的后台界面付出流量。改为 lazy 后,后台代码只在实际 * 访问 /admin/* 时才下载。 * * AdminLayout 保持静态引入:它是所有后台页面的公共外壳, * 若也 lazy 则会与页面 chunk 形成串行请求(先下载 layout, * 再下载页面),反而更慢。 */ import { lazy, Suspense } from 'react' import type { ReactNode } from 'react' import { Navigate } from 'react-router-dom' import AdminLayout from './AdminLayout' const Dashboard = lazy(() => import('./pages/Dashboard')) const CollectionPage = lazy(() => import('./pages/Collection')) const DataCompletenessPage = lazy(() => import('./pages/DataCompleteness')) const DataPipelinePage = lazy(() => import('./pages/DataPipeline')) const PredictionsPage = lazy(() => import('./pages/PredictionHistory')) const BacktestPage = lazy(() => import('./pages/Backtest')) const MonitoringPage = lazy(() => import('./pages/Monitoring')) const SettingsPage = lazy(() => import('./pages/Settings')) const LogsPage = lazy(() => import('./pages/Logs')) const EvalPage = lazy(() => import('./pages/EvalPage')) /** * 页面级懒加载的兜底:后台各页共用。 * 保持极简,避免后台切换时出现大块占位跳动。 */ function AdminPageFallback() { return (
加载中…
) } /** 用 Suspense 包住单个后台页面 */ function page(node: ReactNode): ReactNode { return }>{node} } export const adminRoutes = [ { path: '/admin', element: , children: [ { index: true, element: page() }, { path: 'collection', element: page() }, { path: 'data-completeness', element: page() }, { path: 'data-pipeline', element: page() }, { path: 'predictions', element: page() }, { path: 'backtest', element: page() }, { path: 'monitoring', element: page() }, { path: 'settings', element: page() }, { path: 'logs', element: page() }, { path: 'eval', element: page() }, { path: '*', element: }, ], }, ] export { adminRoutes as default }