Spaces:
Running
Running
Frontend Bundle Optimization Summary
π― Results
Before Optimization
- Single vendor bundle: 16 MB (
vendors.98d59d7116d9a52db7bd.js) - Source map: 15 MB
- Build mode: Development (unminified)
- Total: ~31 MB
After Optimization
- Total JS size: 6.67 MB (app bundles only, excluding static files)
- Total dist size: 7.07 MB
- Build mode: Production (minified)
- Bundle splitting: 91 optimized chunks
- Reduction: ~58% smaller (from 16 MB to 6.67 MB)
β Optimizations Applied
1. Production Build Mode
- Changed from development to production mode
- Enabled minification with TerserPlugin
- Removed console.log statements in production
- Disabled source maps in production
2. Advanced Code Splitting
Split the monolithic vendor bundle into multiple optimized chunks:
- Carbon Icons: 21 chunks (~73 KB total)
- Carbon AI: 3 chunks (~1.6 MB total)
- React Vendor: Separate chunk (133 KB)
- Other Vendors: Multiple small chunks for better caching
3. Tree Shaking
- Enabled
usedExports: truefor dead code elimination - Set
sideEffects: falsefor aggressive tree shaking - Configured Babel with
modules: falseto preserve ES6 modules
4. Font Optimization
- Added rule to prevent unnecessary font bundling
- Set
emit: falsefor font assets to avoid duplication
5. Terser Configuration
- Remove comments
- Drop console statements in production
- Drop debugger statements
- Aggressive compression
π Bundle Composition
Largest Chunks
carbon-ai-3959e959.js- 1.1 MB (main Carbon AI Chat)carbon-ai-1e0ec562.js- 408 KB (Carbon AI components)vendors-e567d44f.js- 271 KB (vendor utilities)vendors-20baa8a5.js- 270 KB (vendor utilities)vendors-e9c36b74.js- 264 KB (vendor utilities)
π Usage
Build for Production
./build.sh
Or manually:
NODE_ENV=production pnpm run build
Build for Development
pnpm run dev
π‘ Further Optimization Ideas
1. Lazy Loading Components
Consider lazy loading heavy components like CardManager:
const CardManager = React.lazy(() => import('./CardManager'));
2. Dynamic Imports for Icons
Instead of importing all icons, import only what's needed:
// Bad: imports all icons
import { IconName } from '@carbon/icons-react';
// Good: import specific icons
import IconName from '@carbon/icons-react/es/icon-name';
3. Reduce Carbon AI Chat Bundle
- Check if you can use lighter alternatives
- Consider custom implementation for specific features
- Evaluate if all Carbon AI Chat features are needed
4. CDN for Large Dependencies
Consider loading React, React-DOM from CDN:
<script src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
5. Compression at Server Level
Enable gzip/brotli compression on your web server:
- Gzip can reduce text-based assets by 70-80%
- Brotli can achieve even better compression
6. Remove Unused Dependencies
Review and remove unused packages:
npx depcheck
7. Analyze Bundle Regularly
Run bundle analyzer to track growth:
pnpm add -D webpack-bundle-analyzer
npx webpack-bundle-analyzer dist/bundle-stats.json
π Notes
- The Carbon AI Chat library is the largest dependency (~1.5 MB minified)
- Carbon Icons are now split into 21 chunks for better caching
- The build now uses content hashing for optimal browser caching
- Static files (tailwind.js, background.js) remain unoptimized as they're copied as-is
π Monitoring
To check bundle sizes after changes:
cd dist
find . -name "*.js" ! -name "tailwind.js" ! -name "background.js" -type f | xargs du -ck | tail -1