# Heavy Components Audit

**Date**: 2025-01-27  
**Action**: 6.2.1.3 - Identify heavy components  
**Status**: ✅ Complete

## Summary

This audit identifies all heavy components, large libraries, and components that could benefit from dynamic imports to reduce initial bundle size.

## Already Lazy-Loaded Components ✅

### 1. **EmojiPicker** (`emoji-picker-react`)
- **Size**: ~200KB
- **Location**: 
  - `apps/web/src/features/chat/components/ChatInput.tsx`
  - `apps/web/src/features/chat/components/ChatMessage.tsx`
- **Status**: ✅ Already lazy loaded with `React.lazy()`
- **Impact**: ~200KB saved from initial bundle

### 2. **ImageCropper** (`react-easy-crop`)
- **Size**: ~100KB
- **Location**: `apps/web/src/components/ui/ImageCropper.tsx`
- **Status**: ✅ Already lazy loaded with `React.lazy()` (currently mocked)
- **Impact**: ~100KB saved from initial bundle

### 3. **Toaster** (`react-hot-toast`)
- **Size**: Medium
- **Location**: `apps/web/src/components/feedback/LazyToaster.tsx`
- **Status**: ✅ Already lazy loaded via `LazyToaster` component
- **Impact**: Isolated in vendor-toast chunk

## Chart Components (Lightweight) ✅

### 1. **LineChart**
- **Location**: `apps/web/src/components/charts/LineChart.tsx`
- **Library**: Custom SVG-based implementation
- **Size**: Lightweight (no external chart library)
- **Status**: ✅ No lazy loading needed (lightweight)

### 2. **BarChart**
- **Location**: `apps/web/src/components/charts/BarChart.tsx`
- **Library**: Custom SVG-based implementation
- **Size**: Lightweight (no external chart library)
- **Status**: ✅ No lazy loading needed (lightweight)

### 3. **PieChart**
- **Location**: `apps/web/src/components/charts/PieChart.tsx`
- **Library**: Custom SVG-based implementation
- **Size**: Lightweight (no external chart library)
- **Status**: ✅ No lazy loading needed (lightweight)

## Heavy Libraries (Already in Vendor Chunks) ✅

### 1. **hls.js**
- **Size**: Large (~200KB+)
- **Status**: ✅ Already in `vendor-media` chunk
- **Usage**: Streaming audio/video

### 2. **@tanstack/react-virtual**
- **Size**: Medium
- **Status**: ✅ Already in `vendor-tanstack` chunk
- **Usage**: Virtual scrolling

### 3. **@tanstack/react-query**
- **Size**: Medium
- **Status**: ✅ Already in `vendor-tanstack` chunk
- **Usage**: Data fetching

### 4. **lucide-react**
- **Size**: Large (238 files use it)
- **Status**: ✅ Already in `vendor-icons` chunk
- **Usage**: Icons throughout the app

### 5. **date-fns**
- **Size**: Medium
- **Status**: ✅ Already in `vendor-dates` chunk
- **Usage**: Date utilities

### 6. **zod**
- **Size**: Medium
- **Status**: ✅ Already in `vendor-validation` chunk
- **Usage**: Schema validation

## Feature Chunks (Already Configured) ✅

### 1. **Player Components**
- **Location**: `apps/web/src/features/player/`
- **Status**: ✅ Already in `feature-player` chunk
- **Size**: Large (audio player, controls, visualizations)

### 2. **Upload Components**
- **Location**: `apps/web/src/features/upload/`
- **Status**: ✅ Already in `feature-upload` chunk
- **Size**: Medium (upload modal, progress tracking)

### 3. **Chat Components**
- **Location**: `apps/web/src/features/chat/`
- **Status**: ✅ Already in `feature-chat` chunk
- **Size**: Medium (chat interface, messages, emoji picker)

### 4. **Studio Components**
- **Location**: `apps/web/src/components/studio/`
- **Status**: ✅ Already in `feature-studio` chunk
- **Size**: Large (audio editing, AI tools, file browser)

## Potential Heavy Components (Not Yet Lazy Loaded)

### 1. **@dnd-kit** (Drag and Drop)
- **Size**: Medium (~50-100KB)
- **Location**: Used in playlist reordering
- **Status**: ⚠️ Not lazy loaded
- **Recommendation**: Consider lazy loading if used in heavy features only
- **Priority**: LOW (already in vendor chunk via manual chunks config)

### 2. **dompurify**
- **Size**: Medium (~30-50KB)
- **Location**: Used for sanitizing HTML content
- **Status**: ⚠️ Not lazy loaded
- **Recommendation**: Consider lazy loading if only used in specific features
- **Priority**: LOW (used for security, may need to be available early)

### 3. **Analytics/Charts Pages**
- **Location**: `apps/web/src/pages/AnalyticsPage.tsx`
- **Status**: ⚠️ Page is lazy loaded, but chart components are not
- **Recommendation**: Charts are lightweight (custom SVG), no action needed
- **Priority**: N/A (already optimized)

## Components Using Heavy Libraries

### 1. **PlaybackDashboard**
- **Location**: `apps/web/src/features/streaming/components/PlaybackDashboard.tsx`
- **Libraries**: May use charts
- **Status**: ✅ Part of streaming feature (already chunked)
- **Recommendation**: No action needed

### 2. **TrackStatsDisplay**
- **Location**: `apps/web/src/features/tracks/components/TrackStatsDisplay.tsx`
- **Libraries**: Custom charts (lightweight)
- **Status**: ✅ Lightweight, no action needed

## Summary

### Already Optimized ✅
- ✅ All routes lazy loaded
- ✅ Heavy third-party components (EmojiPicker, ImageCropper) lazy loaded
- ✅ Vendor bundles split into separate chunks
- ✅ Feature chunks configured for player, upload, chat, studio
- ✅ Chart components are lightweight (custom SVG, no heavy libraries)

### Potential Optimizations (Low Priority)
- ⚠️ `@dnd-kit` - Could be lazy loaded if only used in specific features
- ⚠️ `dompurify` - Could be lazy loaded if only used in specific features

### Conclusion

**Most heavy components are already optimized:**
- Heavy third-party libraries are already lazy loaded (EmojiPicker, ImageCropper)
- Vendor bundles are already split
- Feature chunks are already configured
- Chart components are lightweight (no heavy chart libraries)

**No immediate action required** - The codebase already has good code splitting in place. The remaining heavy libraries (`@dnd-kit`, `dompurify`) are relatively small and may not benefit significantly from lazy loading.

## Recommendations

1. **Monitor bundle size** - Use `npm run build` and check `dist/bundle-analysis.html` regularly
2. **Consider lazy loading @dnd-kit** - Only if playlist reordering becomes a heavy feature
3. **Keep dompurify in main bundle** - Security-critical, should be available early
4. **Continue monitoring** - As new features are added, reassess heavy components
