Performance
60 FPS is non-negotiable. The library is built around that contract.
What runs where
| Platform | Animation runs on |
|---|---|
| Web | Compositor (CSS @keyframes, transform + opacity only) |
| RN New Architecture | UI thread via Reanimated 3 worklets |
| RN Old Architecture | Native driver (useNativeDriver: true) |
| Expo Go | Reanimated 3 (bundled with Expo SDK 48+) |
We never animate width / height / top / left. Only transform and opacity.
Budgets
- Initial measurement pass: < 4ms for ≤100 leaf nodes
- Re-measure on resize: debounced to next animation frame, < 2ms
- Bundle size (web, gzipped): < 4 KB
- Bundle size (native, gzipped, excl. Reanimated): < 8 KB
Live frame counter
0 FPS
Big list benchmark
100 skeletons rendered, animated, scrolled. Watch the FPS — should hold at 60.
Loading content
CI regression suite
Every PR runs a 500-item FlashList benchmark on an iPhone 12 simulator and asserts:
expect(p95FrameTime).toBeLessThan(16.67); // ms
expect(initialMeasurePass).toBeLessThan(4); // ms