---
name: capacitor-performance
description: Performance optimization guide for Capacitor apps covering bundle size, rendering, memory, native bridge, and profiling. Use this skill when users need to optimize their app performance.
---
# Performance Optimization for Capacitor
Make your Capacitor apps fast and responsive.
## When to Use This Skill
- User has slow app
- User wants to optimize
- User has memory issues
- User needs profiling
- User has janky animations
## Quick Wins
### 1. Lazy Load Plugins
```typescript
// BAD - All plugins loaded at startup
import { Camera } from '@capacitor/camera';
import { Filesystem } from '@capacitor/filesystem';
import { Geolocation } from '@capacitor/geolocation';
// GOOD - Load when needed
async function takePhoto() {
const { Camera } = await import('@capacitor/camera');
return Camera.getPhoto({ quality: 90 });
}
```
### 2. Reduce Bundle Size
```bash
# Analyze bundle
bunx vite-bundle-visualizer
# Tree-shake imports
import { specific } from 'large-library'; // Good
import * as everything from 'large-library'; // Bad
```
### 3. Optimize Images
```typescript
// Use appropriate quality
const photo = await Camera.getPhoto({
quality: 80, // Not 100
width: 1024, // Limit size
resultType: CameraResultType.Uri, // Not Base64
});
// Lazy load images
```
### 4. Minimize Bridge Calls
```typescript
// BAD - Multiple bridge calls
for (const item of items) {
await Storage.set({ key: item.id, value: item.data });
}
// GOOD - Single call with batch
await Storage.set({
key: 'items',
value: JSON.stringify(items),
});
```
## Rendering Performance
### Use CSS Transforms
```css
/* GPU accelerated */
.animated {
transform: translateX(100px);
will-change: transform;
}
/* Avoid - triggers layout */
.animated {
left: 100px;
}
```
### Virtual Scrolling
```typescript
// Use virtual list for long lists
import { VirtualScroller } from 'your-framework';
}
/>
```
### Debounce Events
```typescript
import { debounce } from 'lodash-es';
const handleScroll = debounce((e) => {
// Handle scroll
}, 16); // ~60fps
```
## Memory Management
### Cleanup Listeners
```typescript
import { App } from '@capacitor/app';
// Store listener handle
const handle = await App.addListener('appStateChange', callback);
// Cleanup on unmount
onUnmount(() => {
handle.remove();
});
```
### Avoid Memory Leaks
```typescript
// Clear large data when done
let largeData = await fetchLargeData();
processData(largeData);
largeData = null; // Allow GC
```
## Profiling
### Chrome DevTools
1. Connect via chrome://inspect
2. Performance tab > Record
3. Analyze flame chart
### Xcode Instruments
1. Product > Profile
2. Choose Time Profiler
3. Analyze hot paths
### Android Profiler
1. View > Tool Windows > Profiler
2. Select CPU/Memory/Network
3. Record and analyze
## Metrics to Track
| Metric | Target |
|--------|--------|
| First Paint | < 1s |
| Time to Interactive | < 3s |
| Frame Rate | 60fps |
| Memory | Stable, no growth |
| Bundle Size | < 500KB gzipped |
## Resources
- Chrome DevTools: https://developer.chrome.com/docs/devtools
- Xcode Instruments: https://developer.apple.com/instruments