Version1

Що таке React Native

Глибоке розуміння React Native — від ідеї «один код, два додатки» до архітектури Bridge та JSI, порівняння з Flutter, Ionic та нативною розробкою, і чому це важливо саме для React-розробника.

Що таке React Native

Задача, яку вирішував Марк Цукерберг у 2012 році

У 2012 році Facebook зіткнувся з проблемою, яка болить і сьогодні у багатьох командах: мобільний застосунок Facebook на iOS був написаний на HTML5, загорнутий у нативну оболонку. Він виглядав як нативний, але відчувався інакше — анімації «смикалися», скролінг запізнювався, а продуктивність залишала бажати кращого. У підсумку Цукерберг публічно назвав ставку на HTML5 «найбільшою стратегічною помилкою» компанії і анонсував перехід на повністю нативні застосунки.

Але перехід на нативну розробку створив іншу проблему: тепер потрібні були дві незалежні команди — одна на Objective-C для iOS, інша на Java для Android. Кожна фіча розроблялась двічі, кожна помилка виправлялась двічі, кожне код-рев'ю проходилось двічі.

Саме з цієї напруги між продуктивністю нативу та ефективністю спільної кодової бази народився React Native.


Від хакатону до production у мільярда пристроїв

У 2013 році інженер Facebook Джордан Волк (Jordan Walke) запропонував революційну ідею на внутрішньому хакатоні: що якщо використовувати JavaScript та React для написання мобільних застосунків, але рендерити не HTML-елементи у WebView, а справжні нативні компоненти платформи?

Ця ідея стала фундаментом React Native.

Ключова відмінність від PhoneGap/Ionic: React Native не «обгортає» веб-сторінку у нативний контейнер. Він використовує JavaScript для опису логіки та структури застосунку, а потім рендерить справжні нативні компонентиUIView на iOS, android.view.View на Android. Те, що ви бачите на екрані — не HTML. Це справжній нативний UI.

Хронологія ключових подій:

РікПодія
2013Внутрішній хакатон Facebook — народження ідеї
2015Відкритий вихідний код на React Conf (лютий)
2016Microsoft додає підтримку Windows та macOS
2018Facebook анонсує масштабний рефакторинг архітектури
2021Початок поступового розгортання New Architecture
2024New Architecture стає стандартом за замовчуванням

Сьогодні React Native використовується у застосунках Facebook, Instagram, Shopify, Discord, Microsoft Teams, Walmart та тисячах інших. За даними State of JS 2023, це найпопулярніша технологія для cross-platform мобільної розробки серед JavaScript-розробників.


Як це працює: від setState до пікселя на екрані

Щоб зрозуміти React Native, потрібно зрозуміти, яким шляхом проходить ваш код від виклику setState до зміни пікселів на фізичному екрані телефону. Ця подорож принципово відрізняється від того, що відбувається у браузері.

Архітектура «Bridge» (до 2024 року)

Класична архітектура React Native складається з трьох потоків (threads), які працюють паралельно і спілкуються між собою:

Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff
skinparam defaultFontSize 13

package "JavaScript Thread" #e3f2fd {
  component "React Components\n(ваш код)" as react #1565c0
  component "React Native Runtime\n(react-native core)" as rn #1565c0
  component "JS Engine\n(Hermes / V8)" as js #1e88e5
}

package "Bridge" #fff3e0 {
  component "JSON Serialization\n(туди-назад)" as bridge #e65100
  note right of bridge
    Асинхронний, батчований.
    Дані серіалізуються у JSON
    і передаються між потоками.
    Це — вузьке місце класичної
    архітектури.
  end note
}

package "Native Thread" #e8f5e9 {
  component "Native Modules\n(Camera, GPS, тощо)" as native #2e7d32
  component "Shadow Thread\n(Yoga layout engine)" as shadow #388e3c
  component "Main Thread / UI Thread\n(рендеринг UI)" as ui #43a047
}

package "Екран пристрою" #f3e5f5 {
  component "UIView (iOS)\nView (Android)" as screen #6a1b9a
}

react --> js : виконання
js --> bridge : виклики API
bridge --> native : команди
bridge --> shadow : layout-запити
shadow --> ui : обчислений layout
native --> ui : нативні події
ui --> screen : рендер
screen --> bridge : events (onPress тощо)

@enduml

Що відбувається, коли ви натискаєте кнопку:

JavaScript Thread отримує подію

Native Thread фіксує натискання (touch event) і серіалізує його у JSON. Bridge передає цей JSON у JavaScript Thread.

React перераховує стан

Ваш onPress обробник виконується у JS Thread. Якщо він викликає setState, React перераховує Virtual DOM та обчислює різницю (reconciliation).

Різниця передається через Bridge

Список змін (які View оновити, які властивості змінити) серіалізується у JSON і передається через Bridge у Native Thread.

Shadow Thread обчислює layout

Yoga — бібліотека layout-обчислень Facebook — перераховує позиції та розміри елементів на основі Flexbox-правил.

UI Thread рендерить результат

Main Thread застосовує зміни до нативних View. Те, що бачить користувач — це справжні UIView на iOS або View на Android.

Чому це важливо розуміти? Класична архітектура має критичний недолік: асинхронність Bridge. Всі виклики між JS та Native — асинхронні та батчуються. Це означає, що якщо ви робите анімацію і оновлюєте 60 кадрів на секунду, кожен кадр має пройти через Bridge. Якщо JS Thread зайнятий важкими обчисленнями — анімація «смикатиметься». Саме тому в React Native так важливо розуміти, де виконується код.

New Architecture: JSI, Fabric та TurboModules (2024)

Facebook розробляв нову архітектуру React Native майже шість років. У 2024 році вона стала стандартом за замовчуванням у нових проєктах. Вона вирішує фундаментальні проблеми Bridge:

Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff
skinparam defaultFontSize 13

package "JavaScript Thread" #e3f2fd {
  component "React Components\n(ваш код)" as react #1565c0
  component "Hermes Engine\n(оптимізований для RN)" as hermes #1e88e5
}

package "JSI — JavaScript Interface" #fff3e0 {
  component "Пряме C++ з'єднання\n(без JSON, без Bridge)" as jsi #e65100
  note right of jsi
    JSI — це C++ API, який дозволяє
    JS-об'єктам безпосередньо
    посилатися на C++ об'єкти.
    Виклики — синхронні!
  end note
}

package "Native Layer" #e8f5e9 {
  component "TurboModules\n(ліниве завантаження)" as turbo #2e7d32
  component "Fabric\n(новий рендерер)" as fabric #388e3c
  component "Yoga 2.0\n(layout engine)" as yoga #43a047
}

package "Екран" #f3e5f5 {
  component "Нативний UI" as screen #6a1b9a
}

react --> hermes
hermes --> jsi : синхронний виклик
jsi --> turbo : нативні API
jsi --> fabric : UI-оновлення
fabric --> yoga : layout
yoga --> screen : рендер

@enduml

Три ключові компоненти New Architecture:

JSI (JavaScript Interface)

C++ шар, який замінює JSON-міст (Bridge). Дозволяє JavaScript-об'єктам безпосередньо посилатися на C++-об'єкти та викликати C++-методи синхронно. Немає серіалізації. Немає затримок.

TurboModules

Нова система нативних модулів. Модулі завантажуються ліниво (лише коли вони потрібні), а не всі одразу при запуску. Значно скорочує час холодного старту.

Fabric

Новий рендерер UI. Дозволяє рендеринг синхронно або конкурентно (разом з React Concurrent Mode). Shadow Tree тепер живе у C++, а не у JavaScript.
Для практичного курсу: більшість матеріалів цього курсу однаково застосовуються як до класичної архітектури, так і до New Architecture — API компонентів (View, Text, FlatList тощо) не змінились. Різниця — «під капотом». Ми будемо зазначати специфічні моменти там, де вони мають практичне значення.

React Native проти інших підходів

Щоб остаточно зрозуміти, що таке React Native, варто порівняти його з альтернативами. На ринку існує кілька різних підходів до cross-platform мобільної розробки, і кожен з них вирішує задачу по-своєму.

Спектр підходів

Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff
skinparam defaultFontSize 13

rectangle "Нативна розробка\n(Swift/Kotlin)" as native #43a047
rectangle "React Native\n(JS → Нативний UI)" as rn #1565c0
rectangle "Flutter\n(Dart → Власний рендерер)" as flutter #e65100
rectangle "Ionic/Capacitor\n(HTML у WebView)" as ionic #9c27b0
rectangle "PWA\n(Web у браузері)" as pwa #607d8b

note bottom of native
  ✓ Максимальна продуктивність
  ✓ Повний доступ до API
  ✗ Окремий код iOS/Android
  ✗ Потрібні різні мови
end note

note bottom of rn
  ✓ Нативний UI
  ✓ React-знання = старт
  ✓ Спільна бізнес-логіка
  ~ Обмеження через JS bridge
end note

note bottom of flutter
  ✓ Власний рендерер (Skia)
  ✓ Висока продуктивність
  ✗ Нова мова (Dart)
  ✗ Свій UI, не нативний
end note

note bottom of ionic
  ✓ HTML/CSS/JS
  ✓ Простий старт
  ✗ WebView продуктивність
  ✗ Не виглядає нативно
end note

note bottom of pwa
  ✓ Повна веб-екосистема
  ✓ Без App Store
  ✗ Немає доступу до API
  ✗ Тільки у браузері
end note

native -right-> rn : "наближається\nдо нативу"
rn -right-> flutter
flutter -right-> ionic
ionic -right-> pwa

@enduml

Детальне порівняння

КритерійНативна розробкаReact NativeFlutterIonic/Capacitor
МоваSwift, KotlinJavaScript/TypeScriptDartHTML/CSS/JS
UI рендерингНативнийНативнийВласний (Skia/Impeller)WebView (HTML)
Продуктивність⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Вигляд UIПлатформенийПлатформенийКастомнийСхожий на веб
Кодова базаОкремаСпільнаСпільнаСпільна
Поріг входу\n(для JS-розробника)Дуже високийНизькийСереднійДуже низький
Доступ до Native APIПовнийЧерез модуліЧерез плагіниЧерез плагіни
Розмір спільнотиВеликаДуже великаВеликаСередня
Чому не Flutter? Flutter — чудова технологія з відмінною продуктивністю. Але вона має два недоліки з точки зору React-розробника: нова мова (Dart) та власний рендерер (Skia/Impeller), що означає, що компоненти виглядають однаково на всіх платформах, але не завжди так само, як нативні додатки платформи. React Native дає нативний look-and-feel «з коробки».

Коли React Native — правильний вибір?

React Native оптимальний, коли:

  • У вас вже є React-команда і ви хочете вийти на мобільний ринок
  • Потрібен нативний look-and-feel — тобто застосунок має виглядати і відчуватися як iOS/Android, а не як «порт» сайту
  • Продуктивність критична, але не настільки, щоб вимагати повністю нативну розробку
  • Потрібний швидкий старт: React Native з Expo дозволяє запустити перший застосунок за 15 хвилин
  • Велика частина логіки — бізнес-логіка, а не специфічний для платформи код (анімації, жести, апаратні можливості)
React Native не підходить, якщо ваш застосунок є graphically intensive (3D-ігри, відеоредактори, застосунки з AR, що вимагають максимального контролю над GPU). Для таких випадків краще обрати або нативну розробку, або спеціалізовані рушії (Unity, Unreal, Metal/Vulkan).

React Native очима React-розробника

Ви вже знаєте React. Компоненти, хуки, JSX, однонаправлений потік даних, Virtual DOM — все це залишається. React Native не замінює React, він розширює його на нову платформу.

Що залишається рівно таким самим:

  • Компонентна модель (function App() { return <...> })
  • Хуки: useState, useEffect, useRef, useMemo, useCallback — всі вони
  • useContext, useReducer, Redux, Zustand — вся система стану
  • props, children, key, умовний рендеринг — все це
  • Типізація TypeScript — інтерфейси, дженерики, типи пропсів
  • Npm/yarn пакети (більшість, якщо вони не залежать від DOM)
  • Тестування з Jest

Що змінюється фундаментально:

Немає HTML-елементів
зміна
Замість <div>, <span>, <p>, <button>, <input> — нативні компоненти: <View>, <Text>, <Pressable>, <TextInput>. Їх не можна змішувати з HTML. Ніколи.
Немає CSS
зміна
Немає .css файлів, className, CSS-селекторів, псевдоелементів, медіазапитів. Є StyleSheet.create() — об'єкт зі стилями, підмножина CSS-властивостей. Лише Flexbox для layout. Немає Grid, Float, Position: fixed.
Немає браузерних API
зміна
Немає window, document, localStorage, navigator.geolocation (є нативні аналоги), fetch є. Немає requestAnimationFrame в тому ж вигляді — є Animated API.
Дві платформи
зміна
Ваш код виконується одночасно на iOS та Android. Вони поводяться по-різному: жести, шрифти, тіні, навігація, клавіатура, дозволи. Потрібно тримати обидва у голові.
Немає DevTools браузера
зміна
Замість F12 — React Native DevTools, Expo DevTools, Flipper. Немає інспекції CSS у реальному часі. Зміни стилів — через гарячу перезавантаження (Fast Refresh).
Правило першого дня: якщо ви ловите себе на думці «хочу написати <div className="container">», зупиніться. У React Native це завжди <View style={styles.container}>. Ця рефлекторна заміна — перший крок до мислення у категоріях React Native.

Екосистема: що вас чекає

React Native — це не лише бібліотека. Це ціла екосистема:

Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff
skinparam defaultFontSize 13

@startmindmap
* React Native
** Expo
*** Managed Workflow
*** EAS Build
*** Expo SDK
**** Camera, Location, Notifications
**** FileSystem, Haptics, Font
** Навігація
*** Expo Router
*** React Navigation
** UI
*** React Native Paper
*** Tamagui
*** Gluestack UI
** Анімації
*** Animated API
*** Reanimated 3
*** Gesture Handler
** Дані
*** RTK Query
*** TanStack Query
*** AsyncStorage
*** SQLite
** Тестування
*** Jest
*** RNTL
*** Maestro
@endmindmap

Практика

Copyright © 2026