Перейти к основному содержимому

React Native init vs Expo

На начальном этапе необходимо использовать какой-нибудь из стартеров. Основные конкурирующие стартеры React Native CLI и Expo, имеющие преимущество одно над другим.

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

Наименованиеreact-native initExpo
Вы можете добавить собственные модули, написанные на Java / Objective-CДаНет
Вес стандартного приложения Hello World5mb25mb
Требуется Android Studio и X-Code для запуска проектовДаНет
Шрифты необходимо импортировать в ручную в X-CodeДаНет
Предоставляет JS API из коробки, например Push-Notification, Asset ManagerНетДа
Вы можете использовать библиотеки, которые используют собственный код в Objective-C/JavaДаНет
Совместное использование приложения(с помощью QR-кода или ссылки)НетДа

Если вы все же выбрали Expo, то вопрос времени, что вы столкнетесь с его ограничениями и захотите использовать нативные модули, то для этого вам придется делать detach. По своему опыту и многих знакомых коллег знаю, что detach делается криво, а это значит, что вам придется рефакторить кучу ошибок. Для меня Live Reloading в симуляторе стал верным другом, но в Expo он постоянно ломается и его постоянно приходится перезапускать, от чего процесс разработки становится мучительным.

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

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

Если бы компоненты Expo работали бы и с react-native cli, то не было бы проблем, а так я наблюдаю пропасть в совместимости стартеров и самое печальное, что Expo начнет подкидывать вам свои дополнительные ошибки, связанные со своей инфраструктурой. В Экспо, версия React Native практически всегда не самая свежая. На момент написания статьи Expo SDK 30.0.0 содержит версию React Native 0.55.4, а актуальная на данный момент 0.57. Например функция debounce не работает, под Android, в дебаг-режиме (активированная опция debug js remotely) для компонента TextInput, а это значит, что вы всегда будете отставать от новых улучшений в библиотеки React Native.

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

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

Пришло время поставить React Native Cli на ваш компьютер и от теории перейти к практике.

EnglishMoji!

Проблемы?

Problem

Пишите в Discord или телеграмм чат, а также подписывайтесь на наши новости

JavaScript Camp

Вопросы

Какой React Native стартер предпочтительней?

  1. Expo
  2. React Native Cli

Done

Чтобы узнать, насколько хорошо вы усвоили этот урок, пройдите тест в мобильном приложении нашей школы по этой теме или в боте Telegram.

EnglishMoji!