výkon: manualChunks vendor knihoven a lazy route komponenty
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,16 +1,29 @@
|
|||||||
import { Toaster } from 'sonner'
|
import { Toaster } from 'sonner'
|
||||||
|
import { lazy, Suspense } from 'react'
|
||||||
import { NavLink, Outlet, Route, Routes } from 'react-router-dom'
|
import { NavLink, Outlet, Route, Routes } from 'react-router-dom'
|
||||||
|
|
||||||
import { SiteSelectionProvider, useSiteSelection } from './context/SiteSelectionContext'
|
import { SiteSelectionProvider, useSiteSelection } from './context/SiteSelectionContext'
|
||||||
import { useWsLogErrorCount } from './hooks/useWsLogErrorCount'
|
import { useWsLogErrorCount } from './hooks/useWsLogErrorCount'
|
||||||
import { Dashboard } from './pages/Dashboard'
|
|
||||||
import Economics from './pages/Economics'
|
// Lazy route komponenty — initial bundle nese jen layout; stránky se dotahují per route.
|
||||||
import EnergyFlows from './pages/EnergyFlows'
|
const Dashboard = lazy(() =>
|
||||||
import ForecastVsActual from './pages/ForecastVsActual'
|
import('./pages/Dashboard').then((m) => ({ default: m.Dashboard })),
|
||||||
import { Logs } from './pages/Logs'
|
)
|
||||||
import Planning from './pages/Planning'
|
const Economics = lazy(() => import('./pages/Economics'))
|
||||||
import SiteConfiguration from './pages/SiteConfiguration'
|
const EnergyFlows = lazy(() => import('./pages/EnergyFlows'))
|
||||||
import { Settings } from './pages/Settings'
|
const ForecastVsActual = lazy(() => import('./pages/ForecastVsActual'))
|
||||||
|
const Logs = lazy(() => import('./pages/Logs').then((m) => ({ default: m.Logs })))
|
||||||
|
const Planning = lazy(() => import('./pages/Planning'))
|
||||||
|
const SiteConfiguration = lazy(() => import('./pages/SiteConfiguration'))
|
||||||
|
const Settings = lazy(() => import('./pages/Settings').then((m) => ({ default: m.Settings })))
|
||||||
|
|
||||||
|
function RouteFallback() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-[40vh] items-center justify-center" role="status" aria-label="Načítání stránky">
|
||||||
|
<div className="h-8 w-8 animate-spin rounded-full border-2 border-slate-700 border-t-slate-300" />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
function SiteCombo() {
|
function SiteCombo() {
|
||||||
const { sites, selectedSiteId, setSelectedSiteId, ready, error } = useSiteSelection()
|
const { sites, selectedSiteId, setSelectedSiteId, ready, error } = useSiteSelection()
|
||||||
@@ -102,7 +115,9 @@ function AppLayout() {
|
|||||||
<SiteCombo />
|
<SiteCombo />
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
<Suspense fallback={<RouteFallback />}>
|
||||||
<Outlet />
|
<Outlet />
|
||||||
|
</Suspense>
|
||||||
<Toaster richColors position="top-right" theme="dark" />
|
<Toaster richColors position="top-right" theme="dark" />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -121,7 +136,14 @@ export default function App() {
|
|||||||
<Route path="site-config" element={<SiteConfiguration />} />
|
<Route path="site-config" element={<SiteConfiguration />} />
|
||||||
<Route path="settings" element={<Settings />} />
|
<Route path="settings" element={<Settings />} />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="logs" element={<Logs />} />
|
<Route
|
||||||
|
path="logs"
|
||||||
|
element={
|
||||||
|
<Suspense fallback={<RouteFallback />}>
|
||||||
|
<Logs />
|
||||||
|
</Suspense>
|
||||||
|
}
|
||||||
|
/>
|
||||||
</Routes>
|
</Routes>
|
||||||
</SiteSelectionProvider>
|
</SiteSelectionProvider>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ export default defineConfig(async () => {
|
|||||||
outDir: 'dist',
|
outDir: 'dist',
|
||||||
assetsDir: 'assets',
|
assetsDir: 'assets',
|
||||||
chunkSizeWarningLimit: 750,
|
chunkSizeWarningLimit: 750,
|
||||||
|
rollupOptions: {
|
||||||
|
output: {
|
||||||
|
// Stabilní vendor chunky: react jádro, grafové knihovny zvlášť (cache + menší initial load).
|
||||||
|
manualChunks: {
|
||||||
|
'vendor-react': ['react', 'react-dom', 'react-router-dom'],
|
||||||
|
'vendor-recharts': ['recharts'],
|
||||||
|
'vendor-nivo': ['@nivo/core', '@nivo/sankey'],
|
||||||
|
'vendor-chartjs': ['chart.js'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
proxy: {
|
proxy: {
|
||||||
|
|||||||
Reference in New Issue
Block a user