Несколько лет назад вопрос «Expo или чистый React Native» решался просто: Expo для прототипов, bare для серьёзных проектов. Сейчас команда React Native сама рекомендует начинать новые приложения с фреймворка, и Expo стал основным выбором. На собесе проверяют, понимаете ли вы, что именно даёт Expo и где его границы.
Что такое Expo
- Expo SDK: набор модулей (камера, файлы, уведомления, защищённое хранилище, обновления и многое другое) с согласованными версиями.
- Expo CLI: запуск, сборка, prebuild.
- Expo Router: маршрутизация по файлам.
- EAS (Expo Application Services): облачная сборка, отправка в сторы, OTA-обновления.
Каждая версия SDK привязана к конкретной версии React Native, поэтому обновление идёт целиком: npx expo install --fix подбирает совместимые версии библиотек.
Expo Go и development build
Expo Go это готовое приложение из стора с фиксированным набором нативных модулей. Удобно для обучения и быстрых проб, но свой нативный код и библиотеки, которых нет в Expo Go, в нём не запустить.
Development build это ваша собственная отладочная сборка (expo-dev-client): в неё попадают все ваши нативные зависимости, а JS по-прежнему подтягивается с Metro с быстрым обновлением. Для реального проекта работают именно так.
Prebuild и CNG
Continuous Native Generation: папки android и ios не хранятся в репозитории, а генерируются командой npx expo prebuild из app.json/app.config.ts и подключённых плагинов. Плюсы:
- обновление React Native не превращается в ручное слияние нативных проектов;
- нативная конфигурация описана декларативно и проверяется ревью;
- меньше конфликтов в Git.
Если нужно поменять что-то в нативном проекте (манифест, Info.plist, Gradle), пишут config plugin: функцию, которая модифицирует сгенерированные файлы при prebuild. Многие библиотеки поставляют свой плагин, его достаточно указать в plugins.
Bare workflow
Нативные папки лежат в репозитории и правятся руками. Нужен, когда:
- много уникального нативного кода и изменений, которые неудобно выражать плагинами;
- приложение интегрируется в существующий нативный проект (brownfield);
- команда сознательно управляет нативными проектами сама.
Важно: bare не значит «без Expo». Модули Expo и EAS работают и в bare-проекте. И наоборот, проект на CNG может содержать собственные нативные модули (через Expo Modules API) без выхода из managed-подхода.
Конфигурация
app.config.ts позволяет вычислять конфиг: разные bundleIdentifier, имя и иконку для dev и prod по переменной окружения. Публичные переменные для JS задаются через EXPO_PUBLIC_*: они встраиваются в бандл и видны всем, секреты туда не кладут.
Обновление SDK
Раз в несколько месяцев выходит новый SDK. Порядок: прочитать заметки о выпуске, обновить expo, выполнить npx expo install --fix, проверить совместимость сторонних библиотек (особенно с новой архитектурой), пересобрать development build, прогнать тесты. Приложения, застрявшие на старых SDK, со временем перестают проходить требования сторов к целевым версиям ОС.
Частые ошибки
- Считать, что в Expo нельзя писать нативный код.
- Разрабатывать реальный проект в Expo Go.
- Править
android/иios/руками при CNG: изменения пропадут при следующем prebuild. - Класть секреты в
EXPO_PUBLIC_*.
Что спросят на собесе
- Что такое Expo и EAS.
- Expo Go против development build.
- Что такое prebuild, CNG и config plugins.
- Когда нужен bare workflow.
- Как обновлять SDK и React Native.