image


В официальной документации React Native, из раздела Getting Started, мы узнаем о том, что у нас есть два пути запуска мобильного приложения: expo и react-native cli. Пользователи Windows и Linux, а таких большинство, зайдя во вкладку Building Projects with Native Code и выбирая Target OS: iOS, встречают надпись, которая отправляет их на стартер Expo, но перед тем как ставить Expo, предлагаю ознакомиться с информацией в следующей таблице и поберечь свою голову не только от тех тумаков, что получил я:


Наименование react-native init Expo
Вы можете добавить собственные модули, написанные на Java / Objective-C Да Нет
Вес стандартного приложения Hello World 5 мБ 25 мБ
Требуется Android Studio и XCode для запуска проектов Да Нет
Шрифты необходимо импортировать вручную в XCode Да Нет
Совместное использование приложения (с помощью QR-кода или ссылки), вам не нужно отправлять весь файл .apk или .ipa Сложней Легче
Если вы хотите поделиться этим приложением, вам нужно отправить весь файл .apk / .ipa Да Нет
Предоставляет JS API из коробки, например Push-Notifications, Asset Manager Нет Да
Если вы все же выбрали Expo, то вопрос времени, что вы столкнетесь с его ограничениями и захотите использовать нативные модули, то для этого вам придется делать detach. По своему опыту и многих знакомых коллег знаю, что detach делается криво, а это значит, что вам придется рефакторить кучу ошибок.

Для меня Live Reloading в симуляторе стал верным другом, но в Expo он постоянно ломается и его постоянно приходится перезапускать, от чего процесс разработки становится мучительным.

В Expo полным полно зависимостей, которые лично вам для проекта будут не нужны, но вы будете обязаны ждать дополнительное время, пока соберется ваш JS бандл с лишним мусором, а после этот мусор Expo добавит в ваш релизный .apk и .ipa на мобильные устройства ваших клиентов, из-за чего время запуска приложения возрастет, а вместе с ним возрастает время на разработку приложения, так как JS бандл приходится собирать очень часто.

Если бы компоненты Expo работали бы и с react-native cli, то не было бы проблем, а так я наблюдаю пропасть в совместимости стартеров и самое печальное, что Expo начнет подкидывать вам свои дополнительные ошибки, связанные со своей инфраструктурой.

Конечно не у всех есть возможность купить Mac, но бэнчмаркинг двух стартеров и мой 2.5 годичный опыт работы на том и другом показывает, что разрабатывать приложение с react-native cli, даже только из под Windows на Android — это более выгодная инвестиция в более профессиональное решение, так как с React-Native используется одна кодовая база под iOS и Android.

Надеюсь на вашу обратную связь, благодаря которой информация в изложенной статье будет корректироваться и дополняться.

Если вам интересна эта статья, то скорее всего вы только начинаете изучать React Native, а значит вам будет интересен мой видео-курс на русском языке по [основам React-Native](react-native-village.github.io), который можно пройти с любым стартером.

Комментарии (5)


  1. Zet_Roy
    14.12.2019 15:03

    Приложение на Expo нестабилен и падает с непонятными ошибками.


    1. apapacy
      15.12.2019 12:11

      Сталкивался с таким например на у тройствах MI правда пофиксилось переводом на последние версии expo


  1. mrTyler
    14.12.2019 15:15

    Expo закрыли возможность делиться приложением через QR код с другими пользователями, теперь это можно сделать только в рамках одного аккаунта, что не лучше чем стандартный Testflight. Кроме того, как было сказано в статье, eject приведет вас к приложению, завязанному на Expo и в какой-то момент вы перепишете все на обычный RN.

    По поводу разработки под iOS без симулятора скажу так, поставьте виртуалку и запускайте проверку реализации там, кроме того, есть разные UX паттерны для iOS/Android, тот же свайп влево в почте, в Android для этого используется длительное нажатие с выпадающим контекстым меню.

    Здесь были уже статьи про RN, как человек с огромным опытом разработки скажу так — берите Swift/Kotlin, если нет денег на двух разработчиков — берите RN, но закладывайте на перспективу реализацию всего в виде нативных приложений. Рано или поздно вам придется столкнуться с проблемами RN, которые заставят вас отказаться от этого замечательного решения, как бы вам этого не хотелось.


  1. apapacy
    15.12.2019 12:09

    Я продолжил один проект разработанный на expo. Вцелом если заведомо не нужен будет натив то впечатление хорошее. Для команд у которых естььвеб разработчики и нужно сделать мобильное приложение без низкоуровневой интеграции. Но если в команде есть на мобильные разработчики то expo не нужен как впрочем и react native.


    По expo можно было бы осветить два режима кажется у них это называется managed/unmanaged то есть с использованием expo в качестве своеобразной виртуальной машине и более нативные. Я работал только с первым вариантом.


    По пуш сообщениям. Да ни идут из коробки но наскол ко я понял. Все идут через транзитный сервер expo и нет возможности отправлять сообщения в топики.


  1. romanonthego
    15.12.2019 14:42

    Expo — отличный инструмент, позволяет быстро запустить приложение. При условии что ваше приложение не завязано на кастомные нативные модули — обычные списки, тест, картинки, графики вот это все.
    Но даже если вы думаете что ваше приложение не завязано на свои нативные модули, рано или поздно встанет вопрос съезда с expo. К вам придет отдел маркетинга и попросит интегрировать аналитику которая не поддерживается expo. Вы обнаружите баг который нельзя пропатчить в expo и можно только ждать следующего sdk. Вы гарантировано будете отставать на несколько версий reanimated, gesture-handler, react-native.
    В сумме, если у вас есть время и ресурсы и вы пишите приложение а не proof-of-concept — начинайте сразу с react-native. это чуть сложнее, но в конечном итоге стоит того.
    Кроме того большая часть библиотек expo ставятся через unimodules — кроме разве что пушей и over-the-air-updates. Первая решается нативным пушами, вторая — AppCenter code-push.