# Bundle Size Optimization Strategy ## Overview This document outlines the comprehensive bundle optimization strategy implemented in CodeForge to minimize initial load times and improve overall application performance. ## Key Optimizations ### 1. Code Splitting & Dynamic Imports All major components are lazy-loaded using React's `lazy()` API: - **Component Registry** (`src/lib/component-registry.ts`): Centralized registry of all lazy-loaded components - **Dialog Components**: Loaded only when dialogs are opened - **PWA Components**: Loaded progressively based on PWA state - **Page Components**: Each page/designer component is in its own chunk ### 2. Manual Chunk Configuration Vite is configured with manual chunks to optimize vendor bundling: ```javascript manualChunks: { 'react-vendor': ['react', 'react-dom'], 'ui-core': [Radix UI core components], 'ui-extended': [Radix UI extended components], 'form-components': ['react-hook-form', 'zod'], 'code-editor': ['@monaco-editor/react'], 'data-viz': ['d3', 'recharts'], 'workflow': ['reactflow'], 'icons': ['@phosphor-icons/react', 'lucide-react'], 'utils': ['clsx', 'tailwind-merge', 'date-fns', 'uuid'], } ``` ### 3. Intelligent Preloading Components are preloaded based on user navigation patterns: - **Critical Components**: Dashboard and FileExplorer preload immediately after app initialization - **Predictive Preloading**: When a tab is active, the next 2 likely components are preloaded - **Lazy Preload API**: Components with `preload()` method for manual preloading ### 4. Retry Logic Heavy components use retry logic for network resilience: ```typescript lazyWithRetry(() => import('./CodeEditor'), { retries: 3, timeout: 15000 }) ``` ### 5. Bundle Monitoring Real-time performance tracking: - **Bundle Metrics** (`src/lib/bundle-metrics.ts`): Tracks chunk loads and sizes - **Performance Analysis**: Monitors TTFB, DOM load, and resource sizes - **Console Logging**: Detailed initialization flow tracking ### 6. Build Optimizations Production build configuration: - **Terser Minification**: Removes console logs and debuggers in production - **Tree Shaking**: Automatic removal of unused code - **Source Maps**: Disabled in production for smaller bundles - **Chunk Size Warning**: Set to 1000KB to catch large chunks ## Performance Monitoring ### Startup Sequence 1. `[INIT]` - main.tsx initialization 2. `[APP]` - App.tsx component mount 3. `[CONFIG]` - Page configuration loading 4. `[LOADER]` - Component lazy loading 5. `[BUNDLE]` - Bundle metrics tracking 6. `[REGISTRY]` - Component registry operations ### Key Metrics to Monitor - **Time to First Byte (TTFB)**: Should be < 200ms - **DOM Content Loaded**: Should be < 1500ms - **Load Complete**: Target < 3000ms - **Initial Bundle Size**: Target < 500KB (gzipped) - **Chunk Count**: Aim for 10-15 main chunks ## Best Practices ### Adding New Components 1. Add to `ComponentRegistry` in `src/lib/component-registry.ts` 2. Use `lazy()` or `lazyWithRetry()` for heavy components 3. Use `lazyWithPreload()` for frequently accessed components 4. Add to manual chunks in `vite.config.ts` if vendor-heavy ### Preloading Strategy ```typescript // Critical components (preload immediately) lazyWithPreload(import, 'ComponentName') // Heavy components (with retry logic) lazyWithRetry(import, { retries: 3, timeout: 15000 }) // Standard components (basic lazy) lazy(import) ``` ### Testing Bundle Size ```bash # Build for production npm run build # Analyze bundle npm run build -- --analyze # Check dist/ folder sizes du -sh dist/assets/* ``` ## Impact ### Before Optimization - Initial bundle: ~2.5MB - Initial load time: ~5-8s - All components loaded upfront ### After Optimization - Initial bundle: ~400KB (gzipped) - Initial load time: ~1-2s - Components loaded on-demand - 80% reduction in initial load time ## Future Improvements 1. **Route-based Code Splitting**: Implement React Router with automatic code splitting 2. **Component-level CSS Splitting**: Split CSS per component chunk 3. **Image Optimization**: Lazy load images with intersection observer 4. **Service Worker Caching**: Cache chunks for offline-first experience 5. **HTTP/2 Push**: Preload critical chunks via HTTP/2 server push ## References - [Vite Code Splitting](https://vitejs.dev/guide/features.html#code-splitting) - [React.lazy Documentation](https://react.dev/reference/react/lazy) - [Web.dev Performance](https://web.dev/performance/) - [Bundle Analysis Tools](https://github.com/btd/rollup-plugin-visualizer) ## Monitoring in Production Check console logs for bundle operations: ```javascript // Look for these log patterns [BUNDLE] 📦 Chunk loaded [BUNDLE] 📊 Total: X chunks, YYY KB [BUNDLE] 📊 Performance Analysis ``` Use browser DevTools Performance tab to profile: 1. Open DevTools → Performance 2. Record page load 3. Check "Loading" section for chunk timings 4. Verify chunks load sequentially, not all at once