--- name: bundle-optimization description: Specialized skill for analyzing JavaScript bundle sizes, identifying optimization opportunities, detecting unused code, and monitoring performance budgets. Use when bundle size exceeds limits, analyzing code splitting, identifying heavy dependencies, or optimizing JavaScript payload. --- # Bundle Analysis & Optimization ## Quick Start When analyzing bundles: 1. **Full Analysis**: `npm run analyze` 2. **Bundle Optimization Check**: `npm run bundle-optimization:check` 3. **Detailed Report**: `npm run bundle-optimization:report` 4. **Recharts Analysis**: `npm run analyze:recharts` ## Commands ### Full Bundle Analysis ```bash # Complete bundle analysis with visual report npm run analyze ``` **Output**: Opens interactive bundle analyzer in browser **Shows**: Chunk sizes, dependencies, code splitting effectiveness ### Bundle Optimization Analysis ```bash # Quick check without report npm run bundle-optimization:check # Detailed analysis with report npm run bundle-optimization:analyze # Generate report files npm run bundle-optimization:report ``` **Output**: Console analysis + optional report files **Shows**: Bundle size, first load JS, chunk analysis, violations ### Specific Library Analysis ```bash # Analyze Recharts chunk npm run analyze:recharts # Analyze all chunks npm run analyze:chunks # Verify Recharts imports npm run verify:recharts-imports ``` ## Performance Budgets ### Current Limits - **First Load JS**: < 128KB (warning: 100KB) - **Total Bundle Size**: < 500KB (warning: 400KB) - **CSS Bundle Size**: < 50KB (warning: 40KB) - **Chunk Count**: < 20 (warning: 15) ### Budget Configuration Budgets are defined in: - `performance-budgets.config.js` - `src/lib/optimization/performance-budget-monitor.ts` - `.github/workflows/performance-budgets.yml` ## Analysis Workflow ### 1. Run Analysis ```bash npm run analyze ``` ### 2. Review Bundle Analyzer Check the interactive report for: - **Large chunks**: > 150KB - **Duplicate code**: Same library in multiple chunks - **Unused code**: Dead code elimination opportunities - **Code splitting**: Effectiveness of async chunks ### 3. Identify Issues Common issues to look for: - **Heavy dependencies**: Libraries > 50KB - **Duplicate modules**: Same code in multiple chunks - **Missing code splitting**: Large initial chunks - **Unused imports**: Dead code in bundle ### 4. Optimize Based on findings: - **Lazy load heavy components**: Use `dynamic()` imports - **Remove unused dependencies**: Clean up imports - **Optimize imports**: Use modular imports - **Split large chunks**: Configure webpack splitChunks ## Code Splitting Analysis ### Current Configuration Code splitting is configured in `next.config.js`: - **Framer Motion**: `chunks: 'async'`, `maxSize: 20KB` - **Swiper**: `chunks: 'async'`, `maxSize: 20KB` - **Recharts**: `chunks: 'async'`, `maxSize: 100KB` - **React Query**: `chunks: 'async'`, `maxSize: 20KB` - **Redux**: `chunks: 'async'`, `maxSize: 20KB` ### Verifying Code Splitting ```bash # Check if libraries are in async chunks npm run analyze # Look for: # - Framer Motion in separate async chunk # - Swiper in separate async chunk # - Recharts in separate async chunk ``` ## Optimization Strategies ### Reduce Bundle Size 1. **Lazy Load Heavy Components** ```typescript const HeavyComponent = dynamic(() => import('./HeavyComponent'), { ssr: false, loading: () => }) ``` 2. **Use Modular Imports** ```typescript // ❌ Bad: imports entire library import _ from 'lodash' // ✅ Good: imports only needed function import debounce from 'lodash-es/debounce' ``` 3. **Remove Unused Dependencies** ```bash # Find unused dependencies npx depcheck # Remove unused packages npm uninstall ``` ### Optimize Code Splitting 1. **Configure Webpack SplitChunks** - See `next.config.js` for current configuration - Adjust `maxSize` for optimal chunk sizes - Use `chunks: 'async'` for non-critical code 2. **Use Dynamic Imports** - Route-based code splitting (automatic in Next.js) - Component-based lazy loading - Library-based async chunks ## Analysis Checklist When analyzing bundles: - [ ] First Load JS < 128KB - [ ] Total Bundle Size < 500KB - [ ] No duplicate modules across chunks - [ ] Heavy libraries in async chunks - [ ] Code splitting working correctly - [ ] No unused code in bundle - [ ] CSS bundle size < 50KB ## Key Metrics ### Critical Metrics - **First Load JS**: JavaScript loaded on initial page load - **Total Bundle Size**: Sum of all JavaScript chunks - **Chunk Count**: Number of separate chunks - **Duplicate Modules**: Code duplicated across chunks ### Performance Impact - **Bundle Size**: Affects download time - **Parse Time**: Affects TTI (Time to Interactive) - **Code Splitting**: Affects initial load vs. total size ## Troubleshooting ### Bundle Size Too Large 1. Run analysis: `npm run analyze` 2. Identify largest chunks 3. Lazy load heavy components 4. Remove unused dependencies 5. Optimize imports ### Code Splitting Not Working 1. Check `next.config.js` configuration 2. Verify `chunks: 'async'` for heavy libraries 3. Ensure dynamic imports use `ssr: false` when needed 4. Check webpack splitChunks configuration ### Duplicate Modules 1. Identify duplicated libraries 2. Check for multiple versions in package.json 3. Use webpack alias to force single version 4. Verify code splitting configuration ## Key Files - `next.config.js` - Webpack and code splitting configuration - `performance-budgets.config.js` - Performance budget limits - `scripts/performance/analyze-bundle-optimization.js` - Analysis script - `src/lib/optimization/bundle-optimization-manager.ts` - Bundle manager