Bundle size optimization for Tauri React applications.
This app includes several optimizations out of the box:
File: src-tauri/Cargo.toml
[profile.release]
codegen-units = 1 # Better LLVM optimization
lto = true # Link-time optimizations
opt-level = "s" # Optimize for size
panic = "abort" # No panic unwinding code
strip = true # Remove debug symbolsFile: src-tauri/tauri.conf.json
{
"build": {
"removeUnusedCommands": true
}
}Removes Tauri commands not called from your frontend.
npm run build:analyze # Build and analyze
# Manual analysis
npm run build
du -sh dist/* # Check output sizes
ls -lah dist/assets/ # Examine chunksThe built-in optimizations are sufficient for most apps. Consider more when:
- Built app > 10MB
- Initial load > 3 seconds
- Large dependencies you don't fully use
// ❌ Imports entire library
import * as icons from 'lucide-react'
// ✅ Import only what you need
import { Search, Settings, User } from 'lucide-react'
// ❌ Full lodash
import _ from 'lodash'
// ✅ Specific functions
import { debounce } from 'lodash-es'// ✅ Tree-shakeable imports
import { format } from 'date-fns/format'
import { parseISO } from 'date-fns/parseISO'
// Or use native API
new Intl.DateTimeFormat('en-US').format(date)For apps with multiple routes/features:
import { lazy, Suspense } from 'react'
const Dashboard = lazy(() => import('./Dashboard'))
const Settings = lazy(() => import('./Settings'))
// In component
<Suspense fallback={<div>Loading...</div>}>
<Dashboard />
</Suspense>// vite.config.ts
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
ui: ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
},
},
},
},
})# src-tauri/Cargo.toml - Comment out unused plugins
[dependencies]
# tauri-plugin-fs = "2" # Remove if not usedOnly include permissions you use in src-tauri/capabilities/desktop.json.
| Issue | Solution |
|---|---|
| Large initial bundle | Implement code splitting |
| Duplicate dependencies | npm ls react then npm dedupe |
| Unused shadcn components | Remove from src/components/ui/ |
| Heavy date library | Use date-fns with tree shaking or native Intl |
# Rust binary size
cd src-tauri && cargo build --release
ls -lah target/release/tauri-app
# Frontend bundle
npm run build && du -sh dist/Remember: Measure before optimizing. Don't over-optimize prematurely.