React Native

Expo і класичний React Native — два шляхи одного фреймворку

Зрозуміле порівняння Expo і React Native CLI — що це таке, чим відрізняються, і чому курс спочатку йде через Expo

Expo і класичний React Native — два шляхи одного фреймворку

Навіщо ця стаття

У першій статті з’явилося питання: якою технологією будувати мобільний застосунок (сайт, React Native, повністю нативні мови тощо). У другій — як усередині влаштований React Native: логіка на JavaScript, малювання операційною системою, збирач коду.

Залишається практичне питання, на якому спотикаються майже всі, хто відкриває документацію вперше:

«Починати з Expo чи з React Native CLI? Це взагалі різні технології?»

Короткі відповіді, які ця стаття розгорне:

  1. Це не два різні React Native.
  2. Це два способи створити проєкт, підключати можливості телефону й збирати програму для встановлення.
  3. У цьому курсі спочатку йде Expo, а класичний шлях (CLI, «голий» проєкт) — обов’язково, але пізніше.

Встановлювати інструменти в цій статті не потрібно. Мета — спокійна карта місцевості, щоб наступна стаття (налаштування середовища) не виглядала як стрибок у невідоме.

Головна думка. React Native — це «двигун і правила» мобільного UI на React. Expo і React Native CLI — різні майстерні, у яких цей двигун збирають у готовий застосунок. Майстерні різні; метал (React Native) — той самий.

Що вже відомо, і чого ще бракує

З попередніх матеріалів:

  • потрібен встановлюваний застосунок, а не лише сайт у браузері;
  • екрани описують у стилі React, малює їх ОС телефону;
  • під час розробки код збирає Metro, JavaScript виконує рушій (часто Hermes).

Чого ще не вистачає на практиці:

  • звідки взяти порожній проєкт (яка команда, який шаблон);
  • як швидко побачити результат на телефоні або симуляторі;
  • звідки беруться камера, сповіщення, безпечне сховище паролів;
  • як з файлів на ноутбуці виходить файл, який можна віддати в магазин додатків.

Саме тут розходяться шляхи Expo і класичного CLI.


Два рівні: «фреймворк» і «спосіб вести проєкт»

Корисно розділити поняття, які в розмовах часто змішують.

React Native
фреймворк
Набір ідей і бібліотек, завдяки яким React-код перетворюється на інтерфейс нативного мобільного застосунку (iOS і Android). Про «під капотом» — попередня стаття.
Спосіб вести проєкт
tooling
Практичні відповіді: якою командою створити репозиторій, які папки там лежать з першого дня, як ставити бібліотеки з доступом до камери, як зібрати установчий файл, як спростити повсякденну розробку.

Expo і React Native CLI — це насамперед відповіді з другої групи. Вони опираються на React Native, а не замінюють його іншим UI-фреймворком на кшталт Flutter.

Типова плутанина. Фраза «ми пишемо на Expo, а не на React Native» звучить так, ніби це конкуренти. Точніше сказати: «ми пишемо на React Native, а проєкт ведемо через Expo» (або «через класичний CLI-проєкт»).
Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff

rectangle "Код екранів\nReact + TypeScript" as CODE #e3f2fd

package "Той самий React Native" #f5f5f5 {
  rectangle "Компоненти, стан,\nзв'язок з ОС" as RN #fff3e0
}

package "Шлях A: Expo" #e8f5e9 {
  rectangle "Зручний старт\nі готові модулі" as EXPO
  rectangle "Збірка\n(у т.ч. хмарна)" as EAS
}

package "Шлях B: класичний CLI" #fff8e1 {
  rectangle "Папки ios/ і android/\nз перших кроків" as BARE
  rectangle "Збірка через\nXcode / Android Studio / CI" as NATIVE
}

CODE --> RN
RN --> EXPO
RN --> BARE
EXPO --> EAS
BARE --> NATIVE

@enduml

Що таке Expo простими словами

Expo — це платформа й набір інструментів навколо React Native, створені для того, щоб:

  • швидше створити проєкт;
  • менше часу витрачати на початкове налагодження нативних середовищ;
  • підключати типові можливості телефону через підготовлені модулі з узгодженим стилем документації;
  • зручніше збирати застосунок для внутрішнього тесту й магазинів (у тому числі через хмарну службу збірки — про неї нижче простими словами).

Аналогія з вебом

У вебі можна:

  • зібрати все «з нуля» (збирач, роутер, деплой — окремо підібрані інструменти);
  • або взяти каркас, де багато рішень уже домовлені (наприклад, фреймворк на кшталт Next.js для React).

Аналогія неповна, але корисна: React ≈ ідея компонентів; React Native ≈ React для телефону; Expo ≈ «каркас і сервіси», які прискорюють життя з React Native.

Expo не скасовує потребу розуміти React Native. Він зменшує кількість ручної роботи на старті й дає готові «цеглинки» для камери, файлів, сповіщень тощо. Коли цеглинки не вистачає — лишається шлях глибше в нативний шар (про це — пізніше в курсі).

З чого складається «світ Expo» (огляд без установки)

Не потрібно запам’ятовувати всі назви продуктів. Достатньо карти ролей.

Створення проєкту

Команда на кшталт «створити застосунок Expo» дає готову структуру з TypeScript-шаблоном (конкретні команди — у наступній статті про середовище).

Перегляд під час розробки

Можна відкрити проєкт у програмі Expo Go на фізичному телефоні (швидкий перегляд багатьох сценаріїв) або в симуляторі / емуляторі на комп’ютері. Обмеження Expo Go й коли потрібна «власна» збірка для розробки — пояснюються при налаштуванні.

Модулі Expo

Готові пакети для типових задач: робота з зображеннями, безпечне збереження секретів, сповіщення, файлова система тощо. У курсі вони з’являтимуться по темах, з повним поясненням.

Збірка для інших людей

Щоб віддати застосунок тестувальнику або в магазин, потрібен установчий пакет. Expo пропонує зручний маршрут через хмарну збірку (EAS — Expo Application Services: сервіси Expo для збірки й супроводу). Деталі профілів збірки — окремі статті ближче до «публікації».
EAS у цій статті — лише ярлик: «хмара, яка вміє зібрати мобільний застосунок за правилами iOS/Android, щоб не обов’язково тримати всю важку збірку лише на своєму ноутбуці». Як саме налаштовувати профілі, підписи й магазини — не зараз.

Що таке React Native CLI і «голий» (bare) проєкт

React Native CLI (інтерфейс командного рядка спільноти React Native) — класичний спосіб створити проєкт, у якому з самого початку (або дуже рано) видно нативні частини:

Папка ios/
частина проєкту
Проєкт для екосистеми Apple. Його відкривають у програмі Xcode (офіційне середовище розробки для iOS). Тут живуть налаштування, від яких залежить збірка для iPhone.
Папка android/
частина проєкту
Проєкт для Android. Його збирають інструментами Android Studio / система збірки Gradle (програма, яка збирає Android-застосунки за описом проєкту).
JavaScript / TypeScript код
частина проєкту
Екрани й логіка — як і в Expo, у звичному React-стилі. Metro знову збирає JS.

Такий проєкт часто називають bare (англ. «голий») — у сенсі «без обгортки Expo як головного способу життя», з прямим доступом до нативних папок. Іноді кажуть bare workflow — «робочий процес із голим нативним проєктом».

Аналогія. Класичний CLI-проєкт — як отримати не лише готову квартиру з меблями, а ще й ключ до щитової й котельні. Більше контролю, більше відповідальності й більше речей, які можна зламати на старті навчання.

Чому цей шлях важчий на першому тижні

Потрібні важчі інструменти платформ

Для повноцінної роботи з iOS на практиці зазвичай потрібна екосистема Apple (комп’ютер Mac і Xcode). Для Android — Android Studio, емулятори, змінні середовища. Усе це реально освоїти, але це окремий обсяг навчання поруч із самим React.

Нативні залежності підключають інакше

Бібліотека, якій потрібна камера, часто містить не лише JavaScript, а й код для iOS/Android. У bare-проєкті розробник ближче стикається з установкою цих частин (автоматичне підключення існує, але збої й документація «нативного» рівня трапляються частіше на старті).

Збірка «як у магазині» — відповідальність команди

Підписи, сертифікати, профілі — усе можна налаштувати, але без хмарних спрощень крива входу крутіша.

Саме тому починати курс з CLI часто означає: тиждень возитися з середовищами, так і не діставшись до списків, навігації й офлайну.


Порівняння поруч

Таблиця нижче — орієнтир, не вирок. Конкретна команда може змішувати підходи (про це далі).

ПитанняExpo (типовий greenfield)React Native CLI / bare
Що цеКаркас і сервіси над React NativeКласичний проєкт RN з нативними папками
Швидкість першого «привіт, світе»Зазвичай вищаЗазвичай нижча
Папки ios/ і android/ у репозиторіїЧасто немає на самому старті; можуть з’явитися пізніше через генераціюЄ одразу (або дуже рано)
Типові можливості телефонуБагато готових модулів ExpoОкремі бібліотеки + нативне підключення
Збірка для тесту / магазинуЗручний маршрут через EASВласний CI, Xcode, Play Console-процеси
Контроль над нативним кодомВисокий за потреби (сучасний Expo це дозволяє), але з іншою моделлю роботиПрямий і звичний для «чистих» native-команд
Ризик на першому тижні навчанняЗастрягти в можливостях Expo Go, не зрозумівши збіркуЗастрягти в Xcode/Gradle, не дійшовши до UI
У цьому курсіОсновний шлях застосунку NomadОкремий обов’язковий модуль пізніше
Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff

rectangle "Мета навчання:\nекрани, дані, камера,\nофлайн, магазини" as GOAL #fff3e0

package "Маршрут курсу" #e8f5e9 {
  rectangle "1. Expo:\nшвидкий зворотний зв'язок" as A
  rectangle "2. Реальні фічі Nomad" as B
  rectangle "3. CLI / bare:\nрозуміння ios/ і android/" as C
}

GOAL --> A
A --> B
B --> C

note right of C
  Без кроку 3 картина RN
  лишається неповною.
  Без кроків 1–2 легко
  втомитися від tooling.
end note

@enduml

Міф: «Expo — лише для іграшок»

Цей міф тягнеться зі старих часів, коли обмеження платформи Expo були жорсткішими, а «вийти» в повний нативний контроль було болючіше.

Сьогодні для багатьох нових продуктів Expo — нормальний production-шлях:

  • застосунки в App Store і Google Play збирають через Expo / EAS;
  • потрібні native-модулі додають, не обов’язково «викидаючи» Expo з першого дня;
  • великі команди публічно описують роботу з Expo на серйозних продуктах.
Зворотний міф теж шкідливий: «Expo розв’яже все, натив ніколи не знадобиться». Специфічні SDK, незвичне «залізо», жорсткі корпоративні вимоги до нативного репозиторію — реальні причини знати bare/CLI. Курс готує до обох полюсів, у розумному порядку.

Міф: «Справжній React Native — тільки CLI»

Справжній React Native — це те, що виконує React-код як мобільний UI на iOS/Android. І Expo-проєкт, і bare-проєкт у типовому сценарії є React Native.

Відрізняється:

  • структура репозиторію;
  • спосіб підключення модулів;
  • повсякденні команди;
  • модель збірки й оновлень.

Не відрізняється ідея з попередньої статті: JS-логіка, малювання ОС, Metro, рушій JS.


Коли обирають Expo

Expo зазвичай доречний, якщо:

Новий продукт

Немає спадкового нативного моноліту, який уже диктує структуру репозиторію.

Команда з вебу на React

Потрібен швидкий шлях до екранів і магазинів без місяця лише на toolchain.

Типові mobile-фічі

Камера, пуш-сповіщення, безпечне сховище, файли — у межах зрілої екосистеми модулів.

Потрібна зручна збірка

Хочеться передбачуваного маршруту «зібрати → віддати тестувальнику → у магазин» без винайдення CI з нуля в перший місяць.

Саме так виглядає навчальний Nomad і більшість «зелених» стартапів на React-команді.


Коли обирають класичний CLI / bare (або сильний ухил у нативні папки)

Вбудовування в існуючий застосунок

React Native додають всередину вже великого Swift/Kotlin-продукту. Тоді контроль нативних проєктів критичний з дня один.

Жорсткі правила репозиторію

Корпоративний стандарт: «у git завжди лежать ios/ і android/, збірка тільки наш Jenkins».

Дуже специфічний native

Потрібен глибокий власний код на Swift/Kotlin як серце продукту, а React Native — лише частина UI.

Підтримка legacy

Проєкт створили роки тому без Expo; міграція «на Expo» можлива, але не завжди пріоритет.

У курсі ці сценарії не ігноруються — для них є окремий модуль після того, як з’являться екрани, дані й базова збірка на Expo.


Важливий міст: Expo вміє «показати» нативні папки

Сучасний Expo — не стіна між розробником і ios/ / android/. Існує процес генерації нативних проєктів з опису конфігурації застосунку (у документації це пов’язано з командами на кшталт prebuild — «попередня збірка / генерація нативних проєктів»).

На рівні цієї статті достатньо ідеї:

Спочатку проєкт може жити без папок ios/ і android/ у git

Конфігурація (ім’я застосунку, ідентифікатори, іконки, плагіни модулів) описується в файлах налаштувань Expo.

Коли потрібні нативні проєкти — їх можна згенерувати

З’являються папки, схожі на ті, що в класичному CLI-проєкті.

Далі можливі різні політики команди

Хтось не комітить згенероване й генерує в CI; хтось комітить і працює ближче до bare. Це вже інженерия процесу, не «магія іншої мови програмування».

Детальний розбір prebuild, «безперервної генерації нативного шару» і порівняння дерев файлів із CLI — у пізнішій статті модуля про bare workflow. Зараз важливо лише: вибір Expo на старті не означає довічну заборону бачити Xcode-проєкт.

Як це стикується з архітектурою з попередньої статті

Незалежно від Expo чи CLI:

ШарЧи змінюється від вибору Expo/CLI?
Опис UI на ReactНі, ідея та сама
Виконання JS (часто Hermes)Ні за суттю
Збір JS (Metro)Ні за суттю; способи запуску можуть відрізнятися командами
Малювання системними елементами ОСНі
Зручність модулів і збіркиТак — це якраз різниця шляхів
Наявність ios/android у репо з дня 1Так
Тому стаття про архітектуру йшла перед порівнянням tooling: спочатку «що таке RN усередині», потім «якою майстернею збирати».

Маршрут саме цього курсу

Модуль орієнтації (зараз)

Зрозуміти задачу RN, архітектуру, різницю Expo vs CLI — без обов’язкової установки в цій статті.

Далі — середовище на Expo

Створити проєкт, запустити на симуляторі/телефоні, побачити перший екран. Почати структуру Nomad.

Основна частина курсу

Навігація, списки, форми, мережа, Redux на мобільному, офлайн, камера, карта, жести, тести, збірка через зручний маршрут Expo/EAS.

Окремий обов’язковий блок

Класичний CLI / bare: створити «голий» проєкт, побачити ios/ і android/, порівняти з генерацією з Expo, торкнутися нативних модулів на оглядовому рівні.

Не пропускати пізній блок CLI лише тому, що Expo «і так закриває потреби». На співбесіді й у чужому репозиторії bare-проєкти трапляються постійно. Мета курсу — впевненість у обох картинах.

Міні-проєкт: три короткі рішення «який шлях ведення проєкту»

Завдання

Уже відомо, що продукт — на React Native (не PWA і не Flutter). Потрібно обрати спосіб вести проєкт: Expo чи класичний CLI / bare.

Для кожної ситуації — один вибір і 2–4 речення обґрунтування. Код не пишеться.

Ситуація 1

Новий застосунок «щоденник подорожей» для iOS і Android. Команда — троє веброзробників на React/TypeScript. Треба за 2–3 місяці дійти до внутрішнього тесту з камерою й офлайном. Нативних інженерів у штаті немає.

Ситуація 2

Великий банківський застосунок уже написаний на Kotlin і Swift. Потрібно вбудувати кілька нових екранів на React Native всередину існуючих програм, зберігаючи поточну нативну збірку й релізний потяг банку.

Ситуація 3

Стартап рік вів продукт на Expo і успішно вийшов у магазини. З’явилась потреба в рідкісному Bluetooth-пристрої; офіційний приклад виробника — лише фрагменти на Swift/Kotlin. Команда готова інвестувати час у нативний міст, але не хоче викидати весь JS-код.

Критерій «готово»

  • У кожній ситуації є явний вибір (або «Expo + поглиблення в native», якщо так точніше для ситуації 3).
  • Обґрунтування спирається на обмеження команди/продукту, а не на «Expo модний» / «CLI серйозніший».

Nomad: яке рішення курсу

Для навчального застосунку Nomad зафіксовано:

Основний проєкт
рішення
Nomad — проєкт на Expo + TypeScript. Саме тут з’являться екрани, навігація, Redux, офлайн, камера.
Окрема пісочниця
рішення
Пізніше — [Nomad](https://github.com/arakviel/nomad)-bare для практики CLI / bare, щоб не ламати основний навчальний додаток під час експериментів з ios/ і android/.
Чому так
обґрунтування
Швидкий зворотний зв’язок на початку курсу + обов’язкове розуміння «голого» проєкту до кінця програми. Код Nomad — окремий репозиторій https://github.com/arakviel/nomad; матеріали курсу — у monorepo kostyl.dev (content/).

Окремого git-коміту в цій статті немає. Після статті про setup з’являється перший коміт ініціалізації Nomad (у повідомленні — шлях матеріалу).


Підсумок

React Native — спільна основа

І Expo, і CLI будують той самий клас застосунків.

Expo — зручна майстерня

Швидкий старт, модулі, зручна збірка; сучасний production-шлях для багатьох команд.

CLI / bare — прямий доступ до ios/ і android/

Більше контролю й ваги toolchain; незамінний у brownfield і для глибокого native.

Курс: спочатку Expo, потім обов’язково CLI

Не «або-або», а послідовність навчання.

Наступний крок — руки в термінал

Налаштування середовища й перший запуск через Expo.


Практичні завдання

Базовий рівень

  1. Пояснити одним абзацом, чому «Expo vs React Native» — хибна постановка питання.
  2. Назвати дві переваги Expo на старті навчання.
  3. Назвати дві ситуації, де bare/CLI виглядає природніше.

Середній рівень

  1. Виконати міні-проєкт (три ситуації).
  2. Описати, що таке папки ios/ і android/ простими словами (по 2–3 речення).
  3. Пояснити, навіщо курсу окрема пісочниця [Nomad](https://github.com/arakviel/nomad)-bare, а не лише один проєкт Nomad.

Професійний рівень

  1. Написати короткий текст для нетехнічного стейкхолдера: «Чому беремо Expo зараз і все одно вчимо CLI».
  2. Скласти список із шести ризиків, якщо команда ніколи не відкриє нативні папки.
  3. Скласти список із шести ризиків, якщо команда з дня один обере лише bare без досвіду mobile toolchain.

Часті запитання

Copyright © 2026