Въведение в Expo SDK 53 — Защо този ъпдейт е толкова важен
Expo SDK 53 е, без преувеличение, едно от най-значимите издания в историята на платформата. И не, не казвам това просто защото звучи добре — наистина е така. Този ъпдейт фундаментално променя начина, по който пишем мобилни приложения с React Native. Новата архитектура вече е активирана по подразбиране, имаме нативни UI компоненти чрез SwiftUI и Jetpack Compose, и десетки подобрения в производителността.
SDK 53 е кулминацията на години работа по модернизиране на инфраструктурата на React Native. Екипът на Expo е работил в тясно сътрудничество с Meta и общността, за да направи прехода максимално гладък. Резултатът? По-бърза производителност, по-богати нативни интеграции и по-приятен процес на разработка.
В тази статия ще разгледаме подробно всички нови функции, ще покажем практически примери с код и ще ви преведем стъпка по стъпка през миграцията от SDK 52. Хайде да започваме.
Новата архитектура (Fabric + Turbo Modules) — Вече е по подразбиране
Какво представлява Новата архитектура
Новата архитектура е основна преработка на начина, по който JavaScript комуникира с нативния слой. Състои се от два ключови компонента:
- Fabric — нова система за рендериране, която замества стария UI Manager. Позволява синхронно и асинхронно рендериране, по-бързо създаване на нативни изгледи и по-ефективно управление на паметта.
- Turbo Modules — нов модулен интерфейс вместо старата Bridge архитектура. Зареждат се лениво (lazy loading), използват JSI за директна комуникация с нативния код и елиминират нуждата от JSON сериализация.
Защо има значение
Старата архитектура използваше асинхронен мост (bridge) за комуникация между JavaScript и нативния слой. Всяко съобщение се сериализираше в JSON, изпращаше се през моста и десериализираше от другата страна. При интензивни UI операции — анимации, жестове — забавянето беше осезаемо.
С Новата архитектура тези ограничения просто изчезват. JavaScript може директно да извиква нативни функции чрез JSI, без сериализация. Fabric позволява синхронно измерване на layout-а, което означава по-плавни анимации и по-бърз отговор на потребителските взаимодействия. На практика, приложенията стават значително по-бързи и по-отзивчиви.
Адопция — числата говорят
Преходът към Новата архитектура не е изненада. Над 74.6% от проектите на SDK 52 вече я бяха активирали. Тоест — по-голямата част от екосистемата вече работи стабилно с Fabric и Turbo Modules. Активирането по подразбиране в SDK 53 е просто естественото продължение.
Ако все още не сте преминали — имате време за адаптация. Можете временно да деактивирате новата архитектура, но честно казано, не го препоръчвам. Старата ще бъде премахната в бъдещи версии.
// app.json — Новата архитектура е активирана по подразбиране в SDK 53
// Ако е необходимо временно деактивиране (не се препоръчва):
{
"expo": {
"sdkVersion": "53.0.0",
"newArchEnabled": false
}
}
Повечето популярни библиотеки вече поддържат Новата архитектура — React Navigation, Reanimated, Gesture Handler, Screens и много други. Ако използвате предимно библиотеки от Expo SDK и добре поддържани community пакети, преходът трябва да е безпроблемен.
Expo UI — Нативни компоненти от SwiftUI и Jetpack Compose
Идеята зад Expo UI
Expo UI е нещо наистина вълнуващо. Тази библиотека ви дава достъп до нативни UI компоненти, изградени със SwiftUI (на iOS) и Jetpack Compose (на Android), директно от JavaScript кода ви. Не обвивки около стари UIKit или Android View компоненти — а истински модерни нативни елементи.
Какво означава това на практика? Компонентите изглеждат и се държат точно като нативните елементи на всяка платформа. Потребителите получават познато изживяване, а вие — мощни инструменти без нужда от писане на нативен код.
Налични компоненти
В първоначалното издание имаме:
- BottomSheet — нативен долен панел с плавни анимации и жестове
- Button — нативен бутон с различни варианти
- ContextMenu — контекстно меню при дълго натискане
- DateTimePicker — избор на дата и час с нативен интерфейс
- Picker — избор от списък с опции
- Slider — плъзгач за стойност в обхват
- Switch — превключвател с нативен вид
- Section — секция за групиране на елементи
Пример — SwiftUI компоненти (iOS)
Ето как изглежда използването на SwiftUI компоненти за екран с профилни настройки:
import { useState } from 'react';
import { View, Text } from 'react-native';
import { BottomSheet, Button } from '@expo/ui/swift-ui';
import { padding } from '@expo/ui/swift-ui/modifiers';
export default function ProfileScreen() {
const [isOpen, setIsOpen] = useState(false);
return (
<View style={{ flex: 1 }}>
<Button variant="bordered" onPress={() => setIsOpen(true)}>
Отвори настройки
</Button>
<BottomSheet isOpened={isOpen} onIsOpenedChange={setIsOpen}>
<Text>Настройки на профила</Text>
</BottomSheet>
</View>
);
}
Забележете колко е познато API-то. Стандартни React патерни, useState за управление на състоянието, безпроблемна интеграция със съществуващите View и Text компоненти. Нищо сложно.
Пример — Jetpack Compose (Android)
За Android имаме компоненти базирани на Jetpack Compose. Ето пример с DateTimePicker и Slider:
import { useState } from 'react';
import { View } from 'react-native';
import { DateTimePicker, Slider, Picker } from '@expo/ui/jetpack-compose';
export default function SettingsScreen() {
const [date, setDate] = useState(new Date());
const [volume, setVolume] = useState(0.5);
return (
<View>
<DateTimePicker
onDateSelected={d => setDate(d)}
displayedComponents="date"
initialDate={date.toISOString()}
variant="picker"
/>
<Slider
value={volume}
onValueChange={setVolume}
/>
</View>
);
}
Кросплатформен подход
Expo UI предлага и платформено-неутрални компоненти, които автоматично избират правилната имплементация според платформата. Код, който работи навсякъде, без условна логика:
import { useState } from 'react';
import { View, Text, Platform } from 'react-native';
import { Picker, Switch } from '@expo/ui';
export default function PreferencesScreen() {
const [language, setLanguage] = useState('bg');
const [notifications, setNotifications] = useState(true);
const languages = [
{ label: 'Български', value: 'bg' },
{ label: 'English', value: 'en' },
{ label: 'Deutsch', value: 'de' },
];
return (
<View style={{ padding: 16 }}>
<Text style={{ fontSize: 18, marginBottom: 8 }}>Език на приложението</Text>
<Picker
selectedValue={language}
onValueChange={setLanguage}
items={languages}
/>
<Text style={{ fontSize: 18, marginTop: 16, marginBottom: 8 }}>
Известия
</Text>
<Switch
value={notifications}
onValueChange={setNotifications}
/>
</View>
);
}
Модификаторите (modifiers) са друга интересна функция — позволяват прилагане на платформено-специфични стилове по декларативен начин. Те следват парадигмата на SwiftUI и Compose модификаторите, давайки достъп до стилизиращи опции, които стандартният React Native StyleSheet просто не може да предложи.
expo-background-task — Нов подход за фонови задачи
Защо беше нужна промяна
Старата expo-background-fetch библиотека ни служеше добре дълги години, но мобилните ОС еволюираха. Android въведе WorkManager, iOS разшири BGTaskScheduler — и старата библиотека не можеше да се възползва пълноценно от тези нови API-та.
expo-background-task е написана от нулата и използва най-добрите нативни инструменти на всяка платформа:
- Android — WorkManager за надеждно планиране, автоматично повторно опитване, съобразяване с ограниченията на батерията и различни типове условия (мрежа, зареждане и др.).
- iOS — BGTaskScheduler, по-ефективен от стария BackgroundFetch API с повече гъвкавост.
Основни предимства
Ето какво печелите с новата библиотека:
- По-надеждно изпълнение — WorkManager и BGTaskScheduler са просто по-умни в планирането на задачи.
- По-добро управление на батерията — задачите се групират така, че да минимизират въздействието върху живота на батерията.
- Условно изпълнение — задачи само при Wi-Fi, само при зареждане или каквото ви трябва.
- Автоматично повторно опитване — при неуспех задачата се опитва отново с експоненциално увеличаващ се интервал.
- Запазване при рестартиране — задачите оцеляват дори след рестартиране на устройството.
Пример за имплементация
Ето как изглежда регистрирането на фонова задача за синхронизация:
import * as BackgroundTask from 'expo-background-task';
import * as TaskManager from 'expo-task-manager';
const BACKGROUND_SYNC_TASK = 'background-sync';
// Дефиниране на задачата — трябва да е в глобалния обхват
TaskManager.defineTask(BACKGROUND_SYNC_TASK, async () => {
try {
const data = await fetchNewContent();
await saveToLocalStorage(data);
return BackgroundTask.BackgroundTaskResult.Success;
} catch (error) {
return BackgroundTask.BackgroundTaskResult.Failed;
}
});
// Регистриране на фоновата задача
async function registerBackgroundSync() {
await BackgroundTask.registerTaskAsync(BACKGROUND_SYNC_TASK, {
minimumInterval: 15 * 60, // 15 минути
stopOnTerminate: false,
startOnBoot: true,
});
}
Едно важно нещо — defineTask трябва да бъде извикан в глобалния обхват, обикновено в главния файл или в модул, който се импортира рано. Операционната система трябва да знае за задачата преди да опита да я стартира.
Разширен пример с условия
А ето и по-реалистичен пример с проверка на мрежата и пълна синхронизация:
import * as BackgroundTask from 'expo-background-task';
import * as TaskManager from 'expo-task-manager';
import * as Network from 'expo-network';
const DATA_SYNC_TASK = 'data-sync-task';
TaskManager.defineTask(DATA_SYNC_TASK, async () => {
try {
const networkState = await Network.getNetworkStateAsync();
if (!networkState.isConnected) {
return BackgroundTask.BackgroundTaskResult.Failed;
}
const lastSync = await AsyncStorage.getItem('lastSyncTimestamp');
const response = await fetch('https://api.example.com/sync', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ since: lastSync }),
});
const newData = await response.json();
await AsyncStorage.setItem('syncedData', JSON.stringify(newData));
await AsyncStorage.setItem('lastSyncTimestamp', new Date().toISOString());
return BackgroundTask.BackgroundTaskResult.Success;
} catch (error) {
console.error('Background sync failed:', error);
return BackgroundTask.BackgroundTaskResult.Failed;
}
});
async function setupBackgroundSync() {
const isRegistered = await TaskManager.isTaskRegisteredAsync(DATA_SYNC_TASK);
if (!isRegistered) {
await BackgroundTask.registerTaskAsync(DATA_SYNC_TASK, {
minimumInterval: 30 * 60, // 30 минути
stopOnTerminate: false,
startOnBoot: true,
});
}
}
Не забравяйте плъгина в конфигурацията:
{
"expo": {
"plugins": [
["expo-background-task"]
]
}
}
Edge-to-Edge оформления на Android
Какво е Edge-to-Edge
Edge-to-Edge е дизайн подход, при който съдържанието се простира до самите ръбове на екрана — зад status bar и navigation bar. Получавате по-потапящо изживяване и по-ефективно използване на пространството.
С Android 15 и 16 Google направи edge-to-edge задължително за всички нови приложения. SDK 53 автоматично настройва проектите за това поведение, без допълнителна конфигурация от ваша страна.
Какво се промени
В SDK 53 следните промени се прилагат автоматично за Android:
- Прозрачни системни ленти — status bar и navigation bar стават прозрачни, а съдържанието се показва зад тях.
- Автоматични отстояния — React Native прилага безопасни зони (safe areas) автоматично.
- Поддръжка на жестова навигация — оформлението се адаптира правилно при жестова навигация.
За повечето проекти промяната е прозрачна. Ако обаче имате персонализирани оформления с фиксирани размери, може да ви трябват корекции. react-native-safe-area-context е вече интегрирана в SDK-то:
import { SafeAreaView } from 'react-native-safe-area-context';
export default function MyScreen() {
return (
<SafeAreaView style={{ flex: 1 }} edges={['top', 'bottom']}>
{/* Съдържание, което се съобразява с безопасните зони */}
</SafeAreaView>
);
}
Тествайте внимателно на различни Android устройства. Обърнете специално внимание на екрани с бутони или текстови полета близо до ръбовете.
expo-maps (Алфа) — Ново поколение карти
Защо нова библиотека за карти
Старата react-native-maps е изградена върху UIKit и Android View — технологии, които постепенно остаряват. Затова Expo екипът създаде expo-maps, базирана на:
- MapKit със SwiftUI на iOS — Apple Maps с Look Around, 3D модели на сгради и подобрена производителност.
- Google Maps с Jetpack Compose на Android — Maps Compose за по-ефективно рендериране.
Какво може
В алфа версията имаме:
- Показване на карта с персонализируем начален регион и мащабиране
- Маркери с персонализирани икони и информационни прозорци
- Полилинии и полигони за маршрути и зони
- Контрол на камерата — програмно преместване и анимации
- Персонализиране на стила с поддръжка на тъмен режим
import { MapView, Marker } from 'expo-maps';
export default function LocationScreen() {
const sofiaCenter = {
latitude: 42.6977,
longitude: 23.3219,
};
return (
<MapView
style={{ flex: 1 }}
initialRegion={{
...sofiaCenter,
latitudeDelta: 0.05,
longitudeDelta: 0.05,
}}
>
<Marker
coordinate={sofiaCenter}
title="София"
description="Столицата на България"
/>
</MapView>
);
}
Тъй като библиотеката е в алфа, API-то може да се промени. Използвайте я за нови или експериментални проекти, а за production — останете на react-native-maps засега.
expo-audio — Вече стабилна
От експериментална към production-ready
expo-audio официално получава статус на стабилна в SDK 53. Това е модерната замяна на аудио частта на expo-av — по-чисто API, по-добра производителност, по-надеждно фоново възпроизвеждане.
Основните подобрения:
- Опростено API — по-интуитивен интерфейс за възпроизвеждане и запис
- Пълна съвместимост с Новата архитектура
- Надеждно фоново аудио — работи при заключен екран и превключване между приложения
- По-ясни грешки — по-предсказуемо поведение при проблеми
- Аудио сесии — правилно управление на аудио фокуса
import { useAudioPlayer, useAudioPlayerStatus } from 'expo-audio';
export default function MusicPlayer() {
const player = useAudioPlayer(
require('./assets/song.mp3')
);
const status = useAudioPlayerStatus(player);
const togglePlayback = () => {
if (status.playing) {
player.pause();
} else {
player.play();
}
};
return (
<View style={{ alignItems: 'center', padding: 20 }}>
<Text style={{ fontSize: 18, marginBottom: 10 }}>
{status.playing ? 'Възпроизвежда се...' : 'На пауза'}
</Text>
<Button
title={status.playing ? 'Пауза' : 'Пусни'}
onPress={togglePlayback}
/>
</View>
);
}
Миграцията от expo-av към expo-audio е силно препоръчителна. expo-av е deprecated и няма да получава нови функции.
Expo Router v5 — По-мощна маршрутизация
Build-time пренасочвания и пренаписвания
Expo Router v5 добавя система за пренасочвания (redirects) и пренаписвания (rewrites), конфигурирани при компилация. Особено полезно за уеб, където URL структурата е критична за SEO.
// app.config.js
module.exports = {
expo: {
experiments: {
router: {
redirects: [
{
source: '/old-profile',
destination: '/user/profile',
permanent: true, // 301 пренасочване
},
{
source: '/blog/:slug',
destination: '/articles/:slug',
permanent: false, // 302 пренасочване
},
],
rewrites: [
{
source: '/api/:path*',
destination: 'https://api.example.com/:path*',
},
],
},
},
},
};
Защитени маршрути
Защитата на маршрути вече е по-елегантна и декларативна:
// app/_layout.jsx
import { Redirect, Stack } from 'expo-router';
import { useAuth } from '../hooks/useAuth';
export default function AppLayout() {
const { user, isLoading } = useAuth();
if (isLoading) {
return <LoadingScreen />;
}
if (!user) {
return <Redirect href="/login" />;
}
return (
<Stack>
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
<Stack.Screen name="settings" options={{ title: 'Настройки' }} />
</Stack>
);
}
Този подход е много по-интуитивен от предишните методи и се вписва естествено във файловата структура на Expo Router.
Други подобрения
- По-бързо начално зареждане — оптимизирана инициализация
- По-добра TypeScript интеграция — по-стриктни типове за параметрите
- Подобрена навигация по таблици — по-плавни анимации и по-ефективна памет
- Server Actions поддръжка — по-добра интеграция за сървърни действия
Metro Bundler — По-стриктни ES модули
Metro в SDK 53 налага по-строго спазване на ES модулната система. Някои неща, които преди се толерираха, вече ще генерират грешки.
Основни промени
- Стриктно разрешаване на модули — файловите разширения може да бъдат задължителни в определени случаи.
- Подобрено tree shaking — по-ефективно премахване на неизползван код, по-малки bundles.
- По-бързо компилиране — оптимизации, които ускоряват процеса на разработка.
Ако разчитате на нестандартен require() или неявни файлови разширения, може да ви трябват корекции:
// Преди (може да не работи в SDK 53)
import MyComponent from './MyComponent';
// След (изрично указване на разширението при нужда)
import MyComponent from './MyComponent.jsx';
// CommonJS require — поддържа се, но ES imports се препоръчват
// Преди
const utils = require('./utils');
// Препоръчително
import * as utils from './utils';
В повечето случаи промените са обратно съвместими. Проверете проекта за предупреждения от Metro след актуализацията.
25% по-бърза компилация на Android
Ето нещо, което ще зарадва всеки Android разработчик — средно 25% по-бързи build-ове. Проект, който преди отнемаше 8 минути, сега се компилира за около 6. Не е грандиозно, но когато правите build-ове всеки ден, усещате разликата.
Как е постигнато
- Оптимизирани Gradle конфигурации — по-добро кеширане и паралелизация.
- Намалени зависимости — премахнати ненужни транзитивни зависимости.
- По-ефективно предварително компилиране на нативни модули.
- Подобрено инкрементално компилиране — малки промени не изискват пълно прекомпилиране.
Всичко се прилага автоматично — просто актуализирайте SDK версията и изпълнете npx expo prebuild --clean.
Ръководство за миграция от SDK 52 към SDK 53
Стъпка 1: Подготовка
Преди да пипнете каквото и да е:
- Направете backup — commit или backup на текущото състояние. Сериозно, не пропускайте тази стъпка.
- Проверете зависимостите — прегледайте третостранните библиотеки за съвместимост с SDK 53 и Новата архитектура.
- Прочетете changelog-а — запознайте се с пълния списък от промени.
Стъпка 2: Актуализация на SDK
Най-лесният начин е чрез Expo CLI:
# Автоматична миграция чрез Expo CLI
npx expo install expo@^53.0.0 --fix
Актуализирайте и конфигурационния файл:
{
"expo": {
"sdkVersion": "53.0.0",
"newArchEnabled": true,
"plugins": [
["expo-background-task"]
]
}
}
Стъпка 3: Актуализация на зависимостите
# Автоматична актуализация на всички Expo зависимости
npx expo install --fix
# Проверка за несъвместимости
npx expo-doctor
npx expo-doctor е изключително полезна команда — анализира проекта и показва потенциални проблеми, несъвместими версии и какво трябва да промените.
Стъпка 4: Миграция от expo-background-fetch към expo-background-task
Ако използвате expo-background-fetch:
# Премахнете старата библиотека
npx expo uninstall expo-background-fetch
# Инсталирайте новата
npx expo install expo-background-task
Ето сравнение на старото и новото API:
// ПРЕДИ — expo-background-fetch
import * as BackgroundFetch from 'expo-background-fetch';
import * as TaskManager from 'expo-task-manager';
const TASK_NAME = 'background-fetch-task';
TaskManager.defineTask(TASK_NAME, async () => {
const data = await fetchData();
return data
? BackgroundFetch.BackgroundFetchResult.NewData
: BackgroundFetch.BackgroundFetchResult.NoData;
});
await BackgroundFetch.registerTaskAsync(TASK_NAME, {
minimumInterval: 15 * 60,
});
// СЛЕД — expo-background-task
import * as BackgroundTask from 'expo-background-task';
import * as TaskManager from 'expo-task-manager';
const TASK_NAME = 'background-sync-task';
TaskManager.defineTask(TASK_NAME, async () => {
try {
const data = await fetchData();
await processData(data);
return BackgroundTask.BackgroundTaskResult.Success;
} catch (error) {
return BackgroundTask.BackgroundTaskResult.Failed;
}
});
await BackgroundTask.registerTaskAsync(TASK_NAME, {
minimumInterval: 15 * 60,
stopOnTerminate: false,
startOnBoot: true,
});
Стъпка 5: Миграция от expo-av към expo-audio
Ако използвате аудио функционалност от expo-av:
# Инсталирайте expo-audio
npx expo install expo-audio
// ПРЕДИ — expo-av
import { Audio } from 'expo-av';
const { sound } = await Audio.Sound.createAsync(
require('./assets/audio.mp3')
);
await sound.playAsync();
// СЛЕД — expo-audio
import { useAudioPlayer } from 'expo-audio';
// В компонент
const player = useAudioPlayer(require('./assets/audio.mp3'));
player.play();
Стъпка 6: Прекомпилиране
След всички промени — прекомпилирайте:
# Изчистване и регенериране на нативните проекти
npx expo prebuild --clean
# Компилиране за iOS
npx expo run:ios
# Компилиране за Android
npx expo run:android
Стъпка 7: Тестване
Тествайте всичко обстойно:
- Всички екрани и навигационни пътища
- Анимации и жестове
- Фоновите задачи
- Аудио възпроизвеждане (ако е приложимо)
- Edge-to-edge оформлението на Android
- Третостранни библиотеки
Deprecated библиотеки
expo-av
expo-av е маркирана като deprecated. Все още работи и ще остане в SDK няколко версии, но нови функции няма да има. Мигрирайте към:
- expo-audio — за аудио
- expo-video — за видео
Разделянето е логично — по-ефективни зависимости и по-малък размер на приложението, когато ви трябва само едната функционалност.
expo-background-fetch
Заменена от expo-background-task. Старата все още работи, но мигрирайте по-скоро — подобренията в надеждността си заслужават.
Други deprecated API-та
Има и някои по-малко използвани API-та, които са маркирани като deprecated. Стартирайте npx expo-doctor след миграцията за пълна картина.
Допълнителни подобрения
React Native версия
SDK 53 е базиран на React Native 0.79 и React 19. Получавате подобрения в производителността на рендерирането, по-добро управление на паметта и множество bugfixes.
EAS Build
EAS Build идва с оптимизации специално за SDK 53 — по-бързо кеширане на зависимости, по-добра съвместимост с Новата архитектура и по-информативни логове при грешки.
Expo Go
Expo Go вече включва Новата архитектура по подразбиране. Средата за разработка е по-близка до production, което намалява онези досадни случаи когато нещо работи в Expo Go, но се чупи в production build-а.
TypeScript
Актуализирани типови дефиниции за всички нови API-та, по-стриктна проверка и по-добро автодовършване в IDE.
Добри практики за SDK 53
Производителност
- Оставете Новата архитектура включена — ползите от производителност са реални и значителни.
- Пробвайте Expo UI компонентите — нативните компоненти са по-бързи и дават по-добро UX.
- Оптимизирайте bundle размера — възползвайте се от подобреното tree shaking.
Архитектура
- Преминете към ES модули — от
require()къмimport/exportза бъдеща съвместимост. - Използвайте expo-audio — по-ефективна е и ще продължи да се развива.
- Конфигурирайте фоновите задачи разумно — подходящи интервали и условия за батерията.
Тестване
- Тествайте на реални устройства — особено edge-to-edge и нативни UI компоненти.
- Тествайте на различни ОС версии — Новата архитектура може да се държи различно на по-стари версии.
- Автоматизирайте — EAS Build за CI/CD е ваш приятел.
Заключение
Expo SDK 53 наистина е повратна точка за React Native разработката. Не е просто поредна инкрементална актуализация — това е нова глава.
Ето най-важните изводи:
- Новата архитектура е production-ready — с над 74.6% адопция, активирането по подразбиране е логичната стъпка.
- Expo UI е революционен — SwiftUI и Jetpack Compose компоненти директно от JavaScript. Това отваря врати, които преди изискваха нативна разработка.
- Фоновите задачи са модернизирани —
expo-background-taskе изградена за съвременните мобилни ОС. - 25% по-бързи Android build-ове — не е малко, особено за CI/CD.
- Expo Router v5 е по-мощен — build-time redirects и защитени маршрути покриват повечето реални сценарии.
Моите препоръки:
- Мигрирайте по-скоро — процесът е добре документиран и инструментите на Expo помагат много.
- Не деактивирайте Новата архитектура — ако има проблеми, търсете решения вместо да се връщате назад.
- Започнете с Expo UI — въвеждайте нативни компоненти постепенно, може би с Button и Switch за начало.
- Планирайте миграцията от deprecated библиотеки —
expo-avиexpo-background-fetchще бъдат премахнати. По-добре сега, отколкото в последния момент. - Следете документацията — екипът на Expo активно я обновява.
SDK 53 ви дава инструментите за по-бързи, по-красиви и по-надеждни мобилни приложения. Възползвайте се от тях.