React Native
React Native — це фреймворк, який виконує React-компоненти в рушії JavaScript на телефоні й перетворює їх на справжні в’ю iOS та Android, а не на вебсторінку. Через цей поділ вебкоманда може випустити застосунок, що відчувається нативним, — і через нього ж типовий збій тут — екран, який перестає відповідати, поки JavaScript зайнятий. Сторінка починається з шістнадцяти речей, які робить екран, і того, що рухається далі, коли потік JavaScript заблоковано; далі — нова архітектура, списки й зображення, Expo й оновлення «по повітрю», релізи до 0.87 і дедлайни магазинів на 2026 рік, що насправді спільне, п’ять задокументованих кейсів, зокрема повернення Shopify до нативу у вересні 2026 року, і те, де все це вироджується.
- Поточна версія
- 0.87 · серп. 2026; 0.88 — 12 жовт.
- Модель
- Ваш JS в одному потоці, справжні нативні в’ю
- Підтримка
- Три останні мінорні версії; нова — приблизно що два місяці
Що рухається, коли JavaScript зайнятий, — шістнадцять речей, які робить екран
Екран на React Native — це дві програми, що розмовляють між собою. Ваш React-код виконується в одному потоці JavaScript. В’ю, яких торкається користувач, належать UIUser Interface — те, що бачить користувачУсе, що користувач бачить і чим керує: екрани, кнопки, поля, стани. UI відповідає за те, ЯК виглядає взаємодія; чи має вона сенс узагалі — це вже питання UX, і ці два поняття плутають постійно.Усі терміни-потоку платформи, його ще називають головним. Здебільшого цієї різниці не видно. Вона стає видимою тієї миті, коли потік JavaScript зайнятий — розбирає велику відповідь, перерендерює довгий список, рахує щось важке, — бо все, що потребує JavaScript, чекає, а все, що не потребує, рухається далі. Тож корисне питання до будь-якої частини екрана — не «чи швидкий React Native?». Воно таке: «який потік це виконує і що побачить користувач, якщо цей потік буде зайнятий пів секунди?». Ось шістнадцять речей, які робить екран. Наступні розділи посилаються на рядки за номерами.
| # | Що робить екран | Де виконується | Якщо JS зайнятий 500 мс | Захід |
|---|---|---|---|---|
| 1 | Скрол уже відрендереного списку | UI-потік — нативний scroll view | Скролиться плавно далі | Нічого: нативний скрол — типова поведінка |
| 2 | Анімація, запущена з useNativeDriver: true | UI-потік, щойно запущена | Не зупиняється | Native driver усюди, де він підтримується; з 0.85 він може анімувати й властивості розкладки (експериментально) |
| 3 | Жест, який ведуть Gesture Handler і ворклет Reanimated | UI-потік | Йде за пальцем | Gesture Handler із Reanimated для всього, що йде за пальцем |
| 4 | Декодування й показ зображень | Нативний конвеєр зображень, поза потоком JS | Зображення вантажаться далі | Запитуйте зображення під розмір показу — декодований піксель займає 4 байти |
| 5 | Перехід нативного стека, що вже почався | UI-потік (react-native-screens) | Завершується плавно | Нативний стек-навігатор, а не анімований із JS |
| 6 | Набір тексту в TextInput | Поле нативне; onChangeText — у JS | Символи з’являються; контрольоване value, яке JS ставить на кожне натискання, може сперечатися з нативним текстом | Поля вільного тексту — неконтрольовані (defaultValue), а шлях натискання — дешевий |
| 7 | Тап по Pressable | Дотик ловить натив; onPress і стиль pressed — у JS | Дія — а на iOS і відгук натискання — приходить пізно | Короткі обробники; нативний відгук (android_ripple, кнопки Gesture Handler) |
| 8 | Заголовок, що йде за скролом через onScroll і setState | Потік JS, на кожну подію скролу | Відстає від пальця, потім стрибає | Animated.event з native driver або useAnimatedScrollHandler з Reanimated |
| 9 | Анімація через setState або через Animated без native driver | Потік JS, кожен кадр | Застигає, потім стрибає в кінець | Рядки 2 і 3 |
| 10 | Нові рядки віртуалізованого списку під час скролу | Їх рендерить потік JS | Порожні клітинки там, де рядки ще не відрендерено | FlashList або налаштований FlatList (getItemLayout, windowSize) з дешевими мемоїзованими рядками |
| 11 | Таймер — setTimeout, setInterval | Потік JS | Спрацьовує пізно | Ніколи не відмірюйте JS-таймером анімацію чи дедлайн |
| 12 | Відповідь на fetch | Запит іде нативною мережею; колбек — у JS | Дані потрапляють на екран пізно — сам запит не був повільнішим | Малі відповіді, пагінація, жодного розбору на шляху рендеру |
| 13 | Перерендер після зміни стану — рендер React і розкладка Yoga | Потік JS | Екран показує попередній стан, доки обидва не завершаться | Опустити стан нижче, мемоїзація, React Compiler — ті самі правила, що й у вебі |
| 14 | Синхронний виклик нативного модуля через JSI | Потік JS чекає на нативний код | Блокує JS на весь час нативного виклику | Синхронно — лише робота на мікросекунди; диск і мережа — асинхронно |
| 15 | Розбір 5 МБ JSON, сортування 10 000 елементів, важкий редʼюсер | Потік JS | Це і є ті 500 мс | Просіть у сервера менше; рахуйте заздалегідь; переносьте роботу в нативний код |
| 16 | Старт — завантаження бандла й рендер першого екрана | Потік JS | Сплеш-екран не зникає | Байткод Hermes (типово); менше роботи до першого екрана; екрани вантажаться, коли їх відкривають |
Два потоки й перехід: нова архітектура
<View> у React Native — це не div і не малюнок. Він стає справжнім UIView на iOS і справжнім android.view.View на Android, які створює й малює платформа. Тому скрол має правильну фізику, клавіатура поводиться коректно, а читачі екрана працюють без додаткових зусиль: нічого з цього не переписано, операційна система робить свою роботу. З тієї ж причини редизайн операційної системи доходить до застосунку на React Native компонент за компонентом, щойно застосунок перезібрано, — сторінка про Flutter показує цю різницю на прикладі iOS 26.
Зміна потрапляє на екран у три кроки. Перший — рендер: React виконує ваші компоненти в потоці JavaScript і будує дерево елементів, а рендерер перетворює його на shadow tree — копію структури екрана, що живе в C++. Другий — розкладка: Yoga, рушій flexbox на C++, рахує розмір і позицію кожного вузла. У типовому випадку обидва кроки відбуваються в потоці JavaScript; термінове оновлення, як-от відповідь на дотик, натомість можуть відрендерити синхронно в UI-потоці. Третій — монтування: UI-потік порівнює нове дерево з тим, що на екрані, і застосовує лише різницю: створити цю в’ю, оновити ту, прибрати третю. UI-потік ніколи не виконує ваш React-код. Він лише застосовує результат.
Початковий задум з’єднував дві сторони «мостом»: кожне повідомлення серіалізували в JSONJavaScript Object Notation — текстовий формат данихТекстовий формат для передавання даних: пари «ключ — значення», списки, числа й рядки. Він народився в JavaScript, але сьогодні його читає будь-яка мова — і саме тому ним відповідає більшість API, а не чимось потужнішим.Усі терміни, ставили в чергу й доставляли пакетами, асинхронно. Це працювало й породило фірмовий збій фреймворку: зайнятий потік JavaScript надсилав вказівки пізно, і кадри втрачалися. Нова архітектура замінює міст трьома частинами. JSI, JavaScript Interface, дозволяє JavaScript тримати пряме посилання на об’єкт C++ і викликати його синхронно, без жодного JSON посередині. Fabric — це описаний вище рендерер, збудований на JSI. TurboModules — нативні модулі, які завантажуються під час першого використання, а не всі на старті, і чиї типи Codegen генерує з типізованої специфікації, тож розбіжність між сигнатурою в JavaScript і нативною падає ще на збірці.
| Версія | Вихід | Що змінилося |
|---|---|---|
| 0.68 | берез. 2022 | Нова архітектура доступна як опція |
| 0.74 | квіт. 2024 | Режим без мосту типово ввімкнено в новій архітектурі |
| 0.76 | жовт. 2024 | Нова архітектура типово ввімкнена; виходять React Native DevTools |
| 0.79 | квіт. 2025 | JavaScriptCore переїжджає в пакет спільноти; віддалене налагодження в Chrome прибрано |
| 0.80 | черв. 2025 | Стару архітектуру заморожено: без виправлень, без тестування, попередження в DevTools |
| 0.82 | жовт. 2025 | Лише нова архітектура: newArchEnabled=false ігнорується |
| 0.84 | лют. 2026 | Hermes V1 типово; старий код прибрано з iOS-збірок; попередньо скомпільовані бінарники iOS |
| 0.85 | квіт. 2026 | Новий бекенд анімацій для Animated і Reanimated, зроблений разом із Software Mansion |
| 0.87 | серп. 2026 | Строгий TypeScript API типово; глибокі імпорти прибрано; Swift Package Manager (експериментально) |
Рушій JavaScript — Hermes, який Meta зробила саме для React Native. Він компілює JavaScript у байткод під час збірки застосунку, тож телефон не розбирає вихідний код на старті, — це перший захід із рядка 16. Hermes V1, перебудований компілятор і віртуальна машина, став типовим у 0.84; на застосунку Expensify команда React Native виміряла загальний час до інтерактивності на 7,6% коротший на Android і на 2,5% — на iOS. JavaScriptCore, рушій Safari, пішов з ядра в 0.79 і живе далі як пакет спільноти.
Списки, перерендери й зображення: звідки береться «React Native повільний»
Майже кожна скарга «React Native повільний» зводиться до рядків 10, 13 чи 15 — список, зайвий перерендер або забагато роботи в потоці JavaScript — або до рядка 4, зображення, якому ніхто не змінив розмір. Списки — першими, бо вони є майже на кожному екрані. Довгий список через .map() у ScrollView монтує кожен рядок, видимий чи ні. FlatList натомість віртуалізований: він монтує вікно рядків навколо екрана й демонтує решту. Типово він спершу рендерить 10 рядків, потім додає по 10 за пакет кожні 50 мс і тримає вікно заввишки 21 екран — десять угорі, десять унизу й видимий. Коли користувач гортає ривком швидше, ніж JavaScript встигає рендерити нові рядки, список показує порожнечу там, де мали бути рядки. Документація називає це порожніми ділянками (blank areas).
| Налаштування | Типово | Що на що міняє |
|---|---|---|
keyExtractor | індекс | Стабільний id на елемент тримає стан рядка разом із рядком, коли елементи вставляють |
getItemLayout | — | Рядки відомої висоти не міряють; прокрутка до елемента 500 стає арифметикою |
windowSize | 21 | Більше — менше порожніх ділянок, більше пам’яті. Менше — навпаки |
initialNumToRender | 10 | Рівно стільки, щоб заповнити перший екран, — це шлях старту |
maxToRenderPerBatch | 10 | Більші пакети заповнюють швидше й довше тримають потік JS на пакет |
removeClippedSubviews | true на Android | Від’єднує позаекранні в’ю від нативної ієрархії; економить роботу, може давати артефакти |
FlashList, список від Shopify, діє інакше: він перевикористовує. Замість монтувати й демонтувати рядки, він тримає приблизно екран клітинок і невеликий запас, а клітинку, що зникла вгорі, віддає елементу, який з’являється внизу. Версія 2, що вийшла 2025 року, працює лише на новій архітектурі й більше не потребує оцінок розміру. Її завантажують близько двох мільйонів разів на тиждень. З 10 вересня 2026 року вона несе ще й власний урок: Shopify йде з React Native і пише, що «веде переговори з кількома компаніями про довгострокове опікунство», — тож бібліотека, від якої ви залежите, тепер має спонсора, за яким треба стежити. Хоч який список, одиниця вартості — рядок. Список не зробить повільний рядок швидким: мемоїзуйте компонент рядка, тримайте його дешевим і давайте стабільний ключ.
Рядок 13 живе за тими самими правилами, що й React у вебі, — про них сторінка React: тримайте стан якомога нижче в дереві, мемоїзуйте те, що отримує незмінні пропси, дайте React Compiler мемоїзувати там, де його ввімкнено. Одне правило — суто мобільне. Навігаційний стек тримає змонтованими екрани під поточним, щоб вони зберігали позицію скролу й стан, — і вони так само перерендерюються щоразу, коли змінюється спільне сховище. freezeOnBlur у React Navigation зупиняє перерендери екранів, яких користувач не бачить; Coinbase 2020 року зробив те саме вручну, а розділ кейсів розповідає, чого їм коштувала відсутність цього.
Рядок 4 — це пам’ять, а не швидкість. Зображення декодують перед показом, і декодоване зображення займає ширина × висота × 4 байти, хоч яким був розмір файлу. Фото на 12 мегапікселів — 4000 на 3000 пікселів — займає в пам’яті 48 МБ, навіть якщо JPEG важив 2 МБ; стрічка з десяти таких — майже пів гігабайта, а на телефоні середнього класу з Android система вбиває застосунок задовго до цього. Просіть у сервера чи CDN той розмір, який справді показуєте, і беріть компонент зображень із дисковим і пам’яттєвим кешем, як-от expo-image.
Expo, нативний код і оновлення «по повітрю»
Expo колись був пісочницею, яку зрештою доводилося покидати. Тепер ні, і власна документація React Native радить починати новий застосунок із фреймворком і називає саме Expo. Він дає сервіс збірки, оновлення «по повітрю», великий набір підтримуваних нативних модулів, роутер на основі файлів і — те, що вирішує, як проєкт старітиме, — config plugins. Config plugin описує зміну нативних проєктів кодом: додати цей дозвіл, зареєструвати той SDKSoftware Development Kit — готовий набір для платформиЗібраний набір бібліотек, інструментів і прикладів для роботи з чужою платформою. Відмінність від API в тому, що API лише описує правила, а SDK дає код, який уже вміє за цими правилами говорити.Усі терміни. Теки ios та android тоді генеруються, а не правляться руками, тож оновлення їх перегенерує й накладе ваші зміни знову. Проєкт, чиї нативні теки правили руками, перетворює кожне оновлення на злиття з власними правками; саме такі проєкти через два роки досі сидять на три версії позаду.
Expo випускає SDK під кожну версію React Native, яку бере, — після того як перевірив бібліотеки разом. SDK 57, що вийшов 30 червня 2026 року, працює на React Native 0.86. SDK 58 у бета-версії з 15 вересня 2026 року на реліз-кандидаті 0.88 і стане стабільним невдовзі після 0.88. Для команди це і є практичний зміст «оновлюватися по одній версії»: по одному SDK, а npx expo install --fix вирівнює під нього кожну бібліотеку Expo.
Оновлення «по повітрю» та їхня точна межа
Оскільки логіка застосунку — це JavaScript, ви можете надіслати новий бандл уже встановленим застосункам без рев’ю магазину — це оновлення «по повітрю» (OTA). Виправлення доходить до користувачів за хвилини, а не за дні. Обидва магазини це дозволяють, у записаних межах. Угода Apple Developer Program License Agreement, розділ 3.3.1(B), каже: інтерпретований код можна завантажувати лише тоді, коли він не змінює основного призначення застосунку, не обходить підпис, пісочницю та інші механізми безпеки й не створює магазину для інших застосунків. Google Play забороняє завантажувати виконуваний код — файли .dex, JAR чи .so — звідки-небудь, крім Play, і робить виняток для коду, що працює у віртуальній машині чи інтерпретаторі, як-от JavaScript, — який однаково мусить відповідати всім іншим правилам Play.
Технічна межа суворіша за юридичну. Оновлення замінює JavaScript і ресурси — зображення, шрифти, тексти — і більше нічого. Усе, що змінює нативний код, потребує нового бінарника й нового рев’ю: додати бібліотеку з нативним модулем, змінити дозвіл, оновити React Native, змінити іконку. Небезпечний випадок — проміжний: оновлення, написане під новішу збірку, приходить на телефони зі старішою. JavaScript кличе нативний модуль, якого немає, і застосунок падає на старті. Expo запобігає цьому через runtime version — мітку нативного шару, яку несе кожна збірка й кожне оновлення, тож оновлення пропонують лише збіркам із тією самою міткою. Політика fingerprint рахує мітку з усього, що може вплинути на нативний код, — це надійніше, ніж піднімати її вручну й пам’ятати про це.
Релізи, оновлення й дедлайни магазинів на 2026 рік
React Native випускає мінорну версію — 0.86, 0.87 — приблизно що два місяці, і команда релізів підтримує три останні. Найновіша — «Active», із частими патчами; найстаріша з трьох — «End of Cycle», лише з виправленнями важливих регресій; усе старіше — «Unsupported». На практиці версію підтримують близько пів року. Від 0.83, з грудня 2025 року, приблизно кожен другий реліз планують без змін, що щось ламають для користувача, — такими були 0.83 і 0.86, — щоб темп було легше витримувати.
| Версія | Вихід | Статус на 2 жовт. 2026 |
|---|---|---|
| 0.89 | заплановано 7 груд. 2026 | Майбутня |
| 0.88 | очікується 12 жовт. 2026 | Реліз-кандидат |
| 0.87 | 10 серп. 2026 | Active |
| 0.86 | 9 черв. 2026 | Active |
| 0.85 | 6 квіт. 2026 | End of Cycle — вийде з підтримки з виходом 0.88 |
| 0.84 і старші | — | Unsupported |
Оновлюватися на одну мінорну версію — нудно й займає пів дня. Оновитися на чотири одразу — займає два тижні, бо фреймворк, бібліотека навігації, кожен нативний модуль і SDK обох платформ рухаються разом, і падіння після оновлення може прийти від будь-якого з них. React Native Upgrade Helper показує точний diff шаблону між будь-якими двома версіями — це більшість нативної роботи в «голому» проєкті. Таблиця релізів вище — ще й бюджет: пів року підтримки означає, що команда, яка оновлюється двічі на рік, ніколи не сидить на непідтримуваній версії, а та, що оновлюється раз на рік, — сидить завжди.
Який React Native перед вами
| Що ви бачите в коді | Що це означає |
|---|---|
newArchEnabled=false у gradle.properties | Хтось відмовився від нової архітектури; з 0.82 цей прапорець ігнорується |
import … from 'react-native/Libraries/…' | Глибокий імпорт з часів до стабільного API 0.80; на 0.87 він перестає компілюватися |
InteractionManager.runAfterInteractions | Прибрано в 0.87 — відкладену роботу плануйте інакше |
react-native-code-push | CodePush з App Center, вимкнений 31 березня 2025 року, — OTA-каналу більше немає |
| JavaScriptCore як рушій | Пакет спільноти з 0.79; Hermes — типовий і перевірений шлях |
| Налагодження через віддалений дебагер Chrome | Прибрано в 0.79; його замінили React Native DevTools |
Правлені руками ios/ та android/ і жодного config plugin | Кожне оновлення — злиття; закладайте на це час або переходьте на згенеровані нативні проєкти |
Дедлайни магазинів — успадковані від обох платформ
Кросплатформний застосунок не звільнений від календаря жодної з платформ — він має обидва. Кожен магазин піднімає мінімальні вимоги до збірок у визначену дату, і зміна доходить до React Native через нативні проєкти та через кожну нативну залежність. Ось ті, що діють або настають близько до дати цієї сторінки.
| Дедлайн | Що вимагає | Що це означає для застосунку на React Native |
|---|---|---|
| Apple, з 28 квіт. 2026 | Завантаження, зібрані в Xcode 26 з iOS 26 SDK | Нативні компоненти отримують вигляд Liquid Glass, намальовані з JS — ні; сам React Native 0.87 вимагає Xcode 26 |
| Apple, застосунки, зібрані з iOS 27 SDK | Життєвий цикл на сценах (UIScene), інакше застосунок не запуститься; ключ відмови від Liquid Glass ігнорується | Шаблон застосунку й кожен нативний модуль, що чіпляється за життєвий цикл, мають підтримувати сцени; Expo SDK 58 зроблено під iOS 27 |
| Google Play, з 1 листоп. 2025 (відстрочки до 31 трав. 2026) | Застосунки з target Android 15 і новіше підтримують сторінки пам’яті по 16 КБ | Кожен файл .so у кожній нативній залежності має бути зібраний із вирівнюванням на 16 КБ; ядро React Native підтримує це з 0.77 |
| Google Play, з 31 серп. 2026 (відстрочки до 1 листоп. 2026) | Нові застосунки й оновлення мають target Android 16 (API 36) | Edge-to-edge більше не вимкнути; predictive back увімкнено типово, а onBackPressed не викликається; на екранах від 600 dp блокування орієнтації ігнорується (тимчасова відмова діє до API 37) |
П’ять кейсів і те, чого в кожному бракувало
Кожен кейс задокументували ті, з ким він стався: інженерні блоги, бюлетень безпеки, повідомлення постачальника про закриття. Разом вони покривають рішення взяти фреймворк, ціну перерендерів, зникнення хостингової залежності, інструменти розробки як поверхню атаки й рішення піти.
| Кейс | Що сталося | Чого бракувало |
|---|---|---|
| Airbnb, 2016–2018 | React Native усередині двох великих нативних застосунків; три платформи замість двох; нову роботу на React Native зупинено в червні 2018 | Рішення про межі — цілий застосунок чи окремий сценарій — і команда, що володіла містком |
| Coinbase, листоп. 2020 | Перемикання вкладок тривало понад секунду; кожен змонтований екран перерендерювався на кожну відповідь API | Підрахунок рендерів у міру додавання фіч; заморожені екрани поза видимістю |
| CodePush, 31 берез. 2025 | Microsoft закрив App Center, і разом із ним — OTA-сервіс, яким користувалися багато застосунків на React Native | План виходу для хостингової залежності |
| Metro4Shell, листоп. 2025 – лют. 2026 | CVE-2025-11953: дев-сервер слухав мережу й передавав запит в оболонку; експлуатація з 21 груд. 2025 | Дев-сервери лише на localhost; інструменти розробки оновлюють як продакшн-залежності |
| Shopify, 2020 – верес. 2026 | П’ять років перенесення всіх застосунків на React Native, потім повернення до Swift і Kotlin | Нічого — змінилося припущення, на якому трималося рішення, і його перевірили знову |
Перший кейс досі цитують у кожній розмові про React Native — і зазвичай хибно. У червні 2018 року Габріел Піл опублікував звіт Airbnb про два роки з React Native. Заголовком була продуктивність; суттю — структура. Airbnb додав React Native у два великі нативні застосунки, що й далі швидко змінювалися: 80 000 рядків продуктового коду на 220 екранах плюс 40 000 рядків інфраструктури на JavaScript — усередині застосунків, де на кожній платформі було приблизно вдесятеро більше коду й учетверо більше екранів. Щоб продуктова робота була можлива, інфраструктурна команда обгорнула для React Native мережу, експерименти, інтернаціоналізацію й анімовані переходи спільних елементів — і підтримувала ці обгортки в ногу з нативним кодом, що не переставав змінюватися. Їхніми словами, вони «зрештою підтримували код на трьох платформах замість двох». Вони також несли близько п’ятдесяти комітів, накладених поверх React Native, що робило кожне оновлення болісним, а час запуску середовища JavaScript шкодив стартовим екранам і диплінкам. Нову роботу на React Native зупинили, а найвідвідуваніші екрани запланували повернути в натив до кінця 2018 року. Більшість інженерів, що з ним працювали, досі оцінювали його добре. Урок — про межі, а не про швидкість.
Третій кейс — сервіс, який просто закінчився. CodePush, сервіс оновлень «по повітрю» від Microsoft, роками був типовим способом доставляти виправлення JavaScript у застосунки на React Native. Він жив усередині App Center, і 31 березня 2025 року Microsoft закрив App Center — а з ним і CodePush. Самостійний сервер, який Microsoft запропонував для власного хостингу, заархівували за два місяці. Команди, для яких OTA був частиною реагування на інциденти, втратили його в конкретну дату, а застосунок, чиї встановлені бінарники дивилися на старий сервіс, більше взагалі не міг отримувати виправлень — зрушити їх міг лише реліз у стор. Виправлення існувало завжди — оновлення від Expo чи сумісний сервіс, — але вимагало нативної зміни, а отже, рев’ю. План виходу з хостингової залежності дешево написати, поки сервіс іще працює.
Четвертий кейс атакував розробників, а не користувачів. 3 листопада 2025 року JFrog розкрив CVECommon Vulnerabilities and Exposures — публічний номер відомої вразливостіПублічний ідентифікатор відомої вади безпеки, як-от CVE-2021-44228 для Log4Shell, щоб постачальники, сканери й бюлетені мали на увазі той самий баг. Номер каже, що вада існує; наскільки вона небезпечна саме для вас, залежить від того, чи працює у вас уражена версія і чи відкрита назовні вражена частина.Усі терміни-2025-11953 з оцінкою 9,8 з 10 у @react-native-community/cli-server-api — пакеті, на якому працює дев-сервер Metro, що його запускає npx react-native start. Сервер слухав усі мережеві інтерфейси, а не лише машину розробника, і один із його ендпоїнтів передавав частину запиту у функцію, що відкриває файли й URL засобами операційної системи. Будь-хто, хто міг дістатися порту, виконував команди на комп’ютері розробника; на Windows — ще й із довільними аргументами. Версія 20.0.0 це виправила. VulnCheck бачив експлуатацію з 21 грудня 2025 року — так доставляли шкідливе ПЗ, — а 5 лютого 2026 року CISA додала вразливість до свого каталогу експлуатованих. Дев-сервер — це сервер: прив’язуйте його до localhost, тримайте подалі від недовірених мереж і оновлюйте інструменти так само вчасно, як залежності самого застосунку.
Де він вироджується
React Native щедрий там, де вебкоманда сильна, і мовчазний там, де вона слабка. Компоненти, стан і отримання даних переходять просто з React, тож екран будувати легко. Не переходять другий потік, нативні проєкти й календар магазинів — і майже кожен збій — одне з цього:
- Анімації й ефекти скролу, керовані з JavaScript, що смикаються тієї миті, коли в потоку з’являється справжня робота (рядки 8–9).
- Довгі списки через
.map()або віртуалізовані списки з дорогими немемоїзованими рядками (рядок 10). - Глобальне сховище, що на кожну зміну перерендерює кожен змонтований екран (рядок 13).
- Фото в повній роздільності, декодовані в пам’ять заради мініатюр (рядок 4).
- Правлені руками теки
iosтаandroid, що перетворюють кожне оновлення на конфлікт злиття. - Версія, що відстала більш ніж на три мінорні, і нативні бібліотеки, які так і не мігрували на нову архітектуру.
- Оновлення «по повітрю» без runtime version, поетапного розгортання й відкату.
- Команда без нативних навичок, що стає першого ж разу, коли фічі потрібен модуль, віджет чи дедлайн магазину.
- Тестування лише на свіжому iPhone, де потік JavaScript достатньо швидкий, щоб приховати всі помилки вище.
- Дев-сервер, доступний з мережі.
Чесна межа — другий потік і друга платформа. Продукт, чия суть — безперервна власна графіка (гра, інструмент для малювання, конвеєр камери), бореться з архітектурою, бо його гарячий шлях хоче жити повністю по один бік переходу. Продукт, збудований навколо можливості, яка не має JavaScript-поверхні й змінюється з кожним релізом ОС, однаково живе в нативному коді. І економіка не стала: React Native окупається, коли одна спільна реалізація економить більше, ніж коштує шар фреймворку, а рішення Shopify 2026 року показує, що цей баланс може зрушити. Для форм, списків, стрічок, комерції й робочих застосунків, які будує команда, що вже пише на React, — тобто для більшості того, що будують, — це досі дуже вигідний обмін.
Практична перевірка займає десять хвилин. Прочитайте версію React Native у package.json і знайдіть її рядок у таблиці релізів. Складіть список нативних залежностей і перевірте в кожної підтримку нової архітектури й дату останнього релізу. Відкрийте найповільніший екран у release-збірці на телефоні середнього класу з Android з увімкненим монітором продуктивності. Знайдіть у коді useNativeDriver: false, обробники onScroll, що викликають setState, і .map( усередині ScrollView. Переконайтеся, що оновлення «по повітрю» несуть runtime version. І звірте target API для Android і версію Xcode з таблицею дедлайнів.
Коли це застосовувати
Застосовуйте, коли
- Продукт, якому потрібні обидві платформи, а будує його команда, що вже пише на React і TypeScriptJavaScript із перевіркою типівJavaScript плюс опис того, що саме функція приймає й повертає, — і цей опис перевіряється в редакторі ще до запуску. У браузер він не потрапляє: перед складанням його компілюють назад у звичайний JavaScript, тож типи — це інструмент розробки, і не більше.Докладніше в статті →Усі терміни.
- Контентні, комерційні та робочі застосунки — форми, списки, навігація, мережа, — тобто більшість того, що будують.
- Продукти, яким вигідно доставляти виправлення без черги рев’ю — у межах оновлень «по повітрю».
- Команди, яким потрібні справжні в’ю платформи — і власні редизайни платформи, — а не їхнє відтворення.
Уникайте, коли
- Ігри, інструменти для малювання й усе, що тримається на безперервній власній графіці, — це боротьба з архітектурою.
- Застосунки навколо можливості платформи, що не має JavaScript-поверхні й змінюється з кожним релізом ОС.
- Однаплатформний продукт, де абстракція коштує вам і нічого не повертає.
- Команди без ресурсу на два релізні пайплайни й два календарі магазинів: спільний код, а не постачання.
Джерела й метод
На чому стоїть ця стаття
- 15 джерел
- 2 задокументовані збої
- Перевірено 13 жовтня 2026 р.
Практики й походження термінів
який потік що виконує, списки, релізи й оновлення по повітрю- ДокументаціяThreading Model (відкривається в новій вкладці)reactnative.dev
- ДокументаціяRender, Commit, and Mount (відкривається в новій вкладці)reactnative.dev
- ДокументаціяOptimizing FlatList Configuration (відкривається в новій вкладці)reactnative.dev
- ДокументаціяReleases Overview (відкривається в новій вкладці)reactnative.dev
- ДокументаціяRuntime versions and updates (відкривається в новій вкладці)Expo documentation
Збої, на яких вчиться стаття
CodePush і Metro4Shell у «П’ять кейсів і те, чого в кожному бракувало»- ДокументаціяVisual Studio App Center Retirement (відкривається в новій вкладці)Microsoft Learn
- ДослідженняCritical RCE Vulnerability CVE-2025-11953 Puts React Native Developers at Risk (відкривається в новій вкладці)JFrog · 11.2025
- ДокументаціяCVE-2025-11953 (відкривається в новій вкладці)NIST National Vulnerability Database · 03.11.2025
Airbnb, Coinbase і Shopify
три інші кейси — розповіді самих команд- СтаттяGabriel Peal — React Native at Airbnb (відкривається в новій вкладці)Airbnb Engineering · 19.06.2018
- СтаттяNick Cherry — Optimizing React Native (відкривається в новій вкладці)Coinbase · 19.11.2020
- СтаттяAnnouncing Coinbase’s successful transition to React Native (відкривається в новій вкладці)Coinbase · 14.05.2021
- СтаттяReact Native is the Future of Mobile at Shopify (відкривається в новій вкладці)Shopify Engineering · 01.2020
- СтаттяFive years of React Native at Shopify (відкривається в новій вкладці)Shopify Engineering · 2025
- СтаттяMustafa Ali — Native is now the future of mobile at Shopify (відкривається в новій вкладці)Shopify Engineering · 10.09.2026
- СтаттяMigrating Shop app from React Native to native (відкривається в новій вкладці)Shopify Engineering · 09.2026
Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.
Було корисно?
Поділіться з тим, хто працює над тією ж задачею.