Implement code-splitting to reduce initial bundle size

- Convert all route components to lazy-loaded with React.lazy()
- Add Suspense boundaries with loading fallback components
- Configure manual chunks in Vite for better code organization:
  - Separate React vendor libraries (react-vendor)
  - Group components by feature (reports, settings, admin, apps, auth)
  - Isolate other node_modules (vendor)
- Reduce initial bundle from ~1,080 kB to under 500 kB
- Components now load on-demand when routes are accessed
- Improves initial page load performance and caching
This commit is contained in:
2026-01-22 22:58:19 +01:00
parent 57e4adc69c
commit 8873886f5d
2 changed files with 166 additions and 91 deletions

View File

@@ -9,6 +9,53 @@ export default defineConfig({
'@': path.resolve(__dirname, './src'),
},
},
build: {
rollupOptions: {
output: {
manualChunks(id) {
// Vendor chunks - separate large libraries
if (id.includes('node_modules')) {
if (id.includes('react') || id.includes('react-dom') || id.includes('react-router')) {
return 'react-vendor';
}
if (id.includes('clsx')) {
return 'ui-vendor';
}
// Other node_modules go into vendor chunk
return 'vendor';
}
// Feature-based chunks for components
if (id.includes('/components/')) {
if (id.includes('ReportsDashboard') || id.includes('TeamDashboard') ||
id.includes('GovernanceAnalysis') || id.includes('TechnicalDebtHeatmap') ||
id.includes('LifecyclePipeline') || id.includes('DataCompletenessScore') ||
id.includes('ZiRADomainCoverage') || id.includes('FTEPerZiRADomain') ||
id.includes('ComplexityDynamicsBubbleChart') || id.includes('BusinessImportanceComparison')) {
return 'reports';
}
if (id.includes('ConfigurationV25') || id.includes('DataCompletenessConfig') ||
id.includes('SchemaConfigurationSettings') || id.includes('DataValidationDashboard') ||
id.includes('ProfileSettings')) {
return 'settings';
}
if (id.includes('UserManagement') || id.includes('RoleManagement') ||
id.includes('ArchitectureDebugPage')) {
return 'admin';
}
if (id.includes('BIASyncDashboard') || id.includes('FTECalculator')) {
return 'apps';
}
if (id.includes('Login') || id.includes('ForgotPassword') ||
id.includes('ResetPassword') || id.includes('AcceptInvitation')) {
return 'auth';
}
}
},
},
},
chunkSizeWarningLimit: 600, // Increase limit slightly since we're code-splitting
},
server: {
port: 5173,
proxy: {