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: true` for dead code elimination | |
| - Set `sideEffects: false` for aggressive tree shaking | |
| - Configured Babel with `modules: false` to preserve ES6 modules | |
| ### 4. **Font Optimization** | |
| - Added rule to prevent unnecessary font bundling | |
| - Set `emit: false` for font assets to avoid duplication | |
| ### 5. **Terser Configuration** | |
| - Remove comments | |
| - Drop console statements in production | |
| - Drop debugger statements | |
| - Aggressive compression | |
| ## π Bundle Composition | |
| ### Largest Chunks | |
| 1. `carbon-ai-3959e959.js` - 1.1 MB (main Carbon AI Chat) | |
| 2. `carbon-ai-1e0ec562.js` - 408 KB (Carbon AI components) | |
| 3. `vendors-e567d44f.js` - 271 KB (vendor utilities) | |
| 4. `vendors-20baa8a5.js` - 270 KB (vendor utilities) | |
| 5. `vendors-e9c36b74.js` - 264 KB (vendor utilities) | |
| ## π Usage | |
| ### Build for Production | |
| ```bash | |
| ./build.sh | |
| ``` | |
| Or manually: | |
| ```bash | |
| NODE_ENV=production pnpm run build | |
| ``` | |
| ### Build for Development | |
| ```bash | |
| pnpm run dev | |
| ``` | |
| ## π‘ Further Optimization Ideas | |
| ### 1. **Lazy Loading Components** | |
| Consider lazy loading heavy components like CardManager: | |
| ```typescript | |
| const CardManager = React.lazy(() => import('./CardManager')); | |
| ``` | |
| ### 2. **Dynamic Imports for Icons** | |
| Instead of importing all icons, import only what's needed: | |
| ```typescript | |
| // 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: | |
| ```html | |
| <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: | |
| ```bash | |
| npx depcheck | |
| ``` | |
| ### 7. **Analyze Bundle Regularly** | |
| Run bundle analyzer to track growth: | |
| ```bash | |
| 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: | |
| ```bash | |
| cd dist | |
| find . -name "*.js" ! -name "tailwind.js" ! -name "background.js" -type f | xargs du -ck | tail -1 | |
| ``` | |