24. Производительность
React Native по умолчанию быстрый, но для больших приложений нужны оптимизации.
Hermes Engine
Заголовок раздела «Hermes Engine»JavaScript движок Meta для мобильных. AOT компиляция в байткод:
{ "expo": { "jsEngine": "hermes" } }- Время запуска -40-60%
- Меньше потребление памяти
- Включён по умолчанию в новых проектах
FlashList — замена FlatList
Заголовок раздела «FlashList — замена FlatList»npx expo install @shopify/flash-listimport { FlashList } from "@shopify/flash-list";
// В 10x быстрее FlatList<FlashList data={data} renderItem={({ item }) => <Item item={item} />} estimatedItemSize={80} // Примерная высота — важно! keyExtractor={(item) => item.id}/>React.memo и useCallback
Заголовок раздела «React.memo и useCallback»// Без memo: перерендер при КАЖДОМ изменении родителяconst Item = ({ data, onPress }) => <View>...</View>;
// С memo: только при изменении propsconst Item = React.memo(({ data, onPress }) => <View>...</View>);
// useCallback — стабильная ссылка на функциюconst handlePress = useCallback((id) => { navigation.navigate('Details', { id });}, [navigation]);
// useMemo — мемоизация вычисленийconst sortedData = useMemo( () => data.sort((a, b) => a.title.localeCompare(b.title)), [data]);InteractionManager
Заголовок раздела «InteractionManager»import { InteractionManager } from 'react-native';
// Выполнить ПОСЛЕ анимации переходаInteractionManager.runAfterInteractions(() => { fetchData(); // Тяжёлая операция buildExpensiveList(); // Не мешает анимации});Image оптимизация
Заголовок раздела «Image оптимизация»import { Image } from 'expo-image';
<Image source={imageUrl} contentFit="cover" cachePolicy="memory-disk" placeholder={{ blurhash: 'LKO2:N%2Tw=w]...' }} transition={200}/>Антипаттерны
Заголовок раздела «Антипаттерны»// ❌ Анонимная функция в JSX (новый объект каждый рендер)<FlatList renderItem={({ item }) => <Item item={item} />} />
// ✅ Вынести renderItemconst renderItem = useCallback(({ item }) => <Item item={item} />, []);<FlatList renderItem={renderItem} />
// ❌ Inline style объект<View style={{ backgroundColor: '#1e1e2e', padding: 16 }} />
// ✅ StyleSheet.create<View style={styles.container} />
// ❌ setState в циклеitems.forEach(item => setState(s => [...s, item]));
// ✅ Batch updatesetState(prev => [...prev, ...items]);Профилирование
Заголовок раздела «Профилирование»# React DevTools → Profiler → Record
# Console timingconsole.time('render');// ...console.timeEnd('render');
# Perf Monitor (встроенный)# Shake устройство → Performance Monitor