Files
cmdb-insight/frontend/vite.config.ts
Bert Hausmans 8873886f5d 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
2026-01-22 22:58:19 +01:00

93 lines
3.6 KiB
TypeScript

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': 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: {
'/api': {
target: 'http://localhost:3001',
changeOrigin: true,
// Ensure cookies are forwarded correctly
configure: (proxy, _options) => {
proxy.on('proxyRes', (proxyRes, req, res) => {
// Rewrite Set-Cookie headers to work with the proxy
// Change domain from backend (localhost:3001) to frontend (localhost:5173)
const setCookieHeaders = proxyRes.headers['set-cookie'];
if (setCookieHeaders) {
const rewritten = Array.isArray(setCookieHeaders)
? setCookieHeaders.map(cookie => {
// Remove domain attribute or rewrite it to work with proxy
return cookie
.replace(/;\s*domain=[^;]+/gi, '') // Remove domain
.replace(/;\s*secure/gi, ''); // Remove secure in dev (if needed)
})
: [setCookieHeaders].map(cookie => {
return cookie
.replace(/;\s*domain=[^;]+/gi, '')
.replace(/;\s*secure/gi, '');
});
proxyRes.headers['set-cookie'] = rewritten;
console.log('[Vite Proxy] Rewritten Set-Cookie headers:', rewritten);
}
});
},
},
},
},
});