New Architecture в React Native 2026: миграция на Fabric, TurboModules и Bridgeless
New Architecture в React Native 0.76+ — это JSI, Fabric, TurboModules и Bridgeless. Разбираем миграцию среднего проекта за 1–2 недели: проверка библиотек, Codegen, реальные замеры производительности.
New Architecture в React Native 2026 — это стек из четырёх компонентов (JSI, Fabric, TurboModules и Bridgeless Mode), включённый по умолчанию с React Native 0.76 и обязательный для всех новых проектов Expo SDK 53+. Если вы всё ещё держите приложение на «мосте», в 2026 году это уже техдолг: React Native 0.81 удалил флаг newArchEnabled=false из шаблонов, а большинство активных библиотек в react-native-directory перевели совместимость в статус «required». Ниже я разберу, что реально меняется, как проверить готовность зависимостей, как поэтапно мигрировать средний проект за 1–2 недели и почему я на шести приложениях выбирал именно поэтапную стратегию.
New Architecture включена по умолчанию с React Native 0.76 (октябрь 2024) и является единственным поддерживаемым режимом в Expo SDK 53 и выше.
Стек включает JSI (замена моста), Fabric (новый рендерер UI), TurboModules (ленивые нативные модули) и Bridgeless Mode (полное удаление старого моста).
Codegen генерирует типобезопасные C++/Objective-C++/Java обёртки из TypeScript спецификаций, и это обязательный шаг для новых нативных модулей.
Проверять совместимость библиотек нужно через reactnative.directory с фильтром newArchitecture=true; на июль 2026 года ~94% топ-500 библиотек уже совместимы.
Основные выигрыши: синхронный доступ к нативу через JSI, ленивая загрузка модулей (–20–40% времени старта), конкурентный рендер React 19.
Реальная миграция среднего приложения (150–200 экранов) занимает 1–2 недели чистого времени, если зависимости готовы. Львиная доля усилий уходит на то, чтобы переписать 1–2 самописных нативных модуля под Codegen.
Что такое New Architecture в React Native?
New Architecture — это переработанный рантайм React Native, в котором JavaScript и нативный код взаимодействуют напрямую через JSI (JavaScript Interface) вместо асинхронного сериализованного «моста». Впервые концепция была представлена командой Meta ещё в 2018 году, стабильный статус получила в React Native 0.68, а в релизе 0.76 стала настройкой по умолчанию для всех новых проектов. С этого момента говорить «включить новую архитектуру» уже не совсем корректно. Правильнее говорить «не отключать её».
Ключевое отличие простыми словами: раньше вызов нативного метода (например, AsyncStorage.getItem('token')) упаковывался в JSON, отправлялся через очередь моста в нативный поток, обрабатывался, ответ упаковывался обратно и возвращался в JS. Всё это асинхронно и с непредсказуемыми задержками. В New Architecture тот же вызов проходит через C++ прослойку JSI и может быть синхронным. Это как разница между REST‑запросом на localhost и вызовом функции в том же процессе.
Второе важное отличие: рендерер Fabric. Старый UIManager отправлял операции «создать/обновить view» пакетами через мост, из-за чего сложные списки, жесты и анимации иногда «дёргались». Fabric работает в двух потоках (Shadow Thread и UI Thread) с общим C++ ядром и поддерживает конкурентный рендеринг React 19: Suspense, Transitions и useDeferredValue наконец работают в React Native так же, как в вебе.
Почему стоит переходить на New Architecture в 2026 году
Если коротко, у вас больше нет выбора. React Native 0.81, выпущенный в апреле 2026 года, удалил из шаблонов флаг newArchEnabled=false. Технически ветку старого моста ещё можно собрать, но команда ядра прямо предупредила, что критические баги в ней исправляться уже не будут. Expo пошёл дальше и в SDK 53 (январь 2026) убрал bridge-режим полностью: попытка запустить expo prebuild со старой архитектурой выдаст ошибку конфигурации.
Есть и позитивные причины. На проекте медиа-приложения (~180 экранов, ~40 нативных модулей), которое я вёл в прошлом квартале, миграция дала измеримый прирост: холодный старт на iPhone 12 сократился с 1.9 с до 1.4 с, а JS-thread FPS в тяжёлых сценариях с длинными списками поднялся со стабильных 48 до стабильных 58. Основной вклад дало не то, о чём принято говорить в блогах, не JSI сам по себе, а именно ленивая инициализация TurboModules: 30+ модулей больше не грузились на старте.
Третья причина, честно говоря, самая практичная. Экосистема. Библиотеки, критичные для производительности, уже требуют новую архитектуру или дают на ней принципиально другой опыт. FlashList v2 переключился на Fabric-only режим ещё в конце 2025 года; о том, как это влияет на выбор списочного компонента, я подробно писал в статье про оптимизацию списков в React Native 2026. Reanimated 4 и Skia аналогично: на старом мосте вы получите функционал, но без ключевых оптимизаций.
Четыре компонента: JSI, Fabric, TurboModules, Bridgeless
Разберём стек по слоям. Понимание границ ответственности каждого компонента сильно облегчает отладку.
JSI (JavaScript Interface)
Тонкая C++ прослойка, позволяющая JS-движку (Hermes или JSC) держать ссылки на C++ объекты и вызывать их методы напрямую, без сериализации. Это фундамент, на нём построено всё остальное. Практически: если вы пишете нативный модуль с блокирующим API (например, чтение из MMKV или expo-sqlite), JSI даёт возможность делать это синхронно, без await.
Fabric
Новый рендерер. Внутри работают три «дерева»: React Element Tree (JS), Fabric Shadow Tree (C++, для layout через Yoga) и Host View Tree (нативные views). Синхронизация идёт через C++ ядро, а не через мост. Практический эффект: измеримо более плавные жесты и анимации, плюс поддержка concurrent React.
TurboModules
Замена старых NativeModules. Ключевое отличие, ленивая инициализация. Старая архитектура загружала все зарегистрированные модули на старте приложения. TurboModule создаётся при первом обращении из JS. Плюс типобезопасный интерфейс через Codegen: TypeScript спецификация превращается в сгенерированные C++/ObjC++/Java стабы.
Bridgeless Mode
Финальный шаг. Полностью удаляет очередь моста как совместимый слой. Устраняет накладные расходы, но требует, чтобы все зарегистрированные модули были нативно совместимы. С 0.76 включен по умолчанию через ReactNativeFeatureFlags.enableBridgelessArchitecture.
Как проверить совместимость библиотек
Первое и главное действие перед миграцией, аудит зависимостей. Инструмент, reactnative.directory, официальный каталог с фильтром New Architecture. Прогоните весь package.json:
npx react-native-check-new-arch
# или через Expo:
npx expo-doctor
# ручная проверка одного пакета:
npm view react-native-svg peerDependencies
На июль 2026 около 94% активно поддерживаемых библиотек в директории имеют статус newArchitecture: true. Проблемы обычно в двух категориях:
Забронзовевшие модули. Заброшенные обёртки над SDK 2019–2021 года без коммитов больше года. Здесь ответ один: искать замену или форкать.
Совместимость через interop layer. Библиотека работает на новой архитектуре, но через слой совместимости, а не как полноценный TurboModule. Функционально всё хорошо, оптимизации не получите. Это не блокер миграции.
Как включить New Architecture в Expo проекте?
Если вы на Expo SDK 53 или выше, вам не нужно ничего делать: всё уже включено. Проверка сводится к одному полю в app.json:
Если поле отсутствует, оно неявно считается true. Более того, попытка выставить false на SDK 53+ приведёт к ошибке expo prebuild. Для проверки после установки зависимостей запустите:
expo-doctor в версии 1.13+ отдельно предупреждает о зависимостях без поддержки новой архитектуры и о конфликтах peer-versions. Флаг --clean обязателен: старые артефакты билда часто ломают первый прогон (я на этом попадался как минимум трижды).
Включение в bare React Native проекте
Для чистого React Native (без Expo) активация зависит от платформы.
iOS
В ios/Podfile флаг ENV['RCT_NEW_ARCH_ENABLED'] должен быть '1'. С 0.76 это значение по умолчанию:
После правок запустите bundle exec pod install в папке ios.
Android
В android/gradle.properties:
newArchEnabled=true
hermesEnabled=true
Затем cd android && ./gradlew clean. Первая сборка после переключения занимает в 2–3 раза больше времени. Codegen генерирует C++ и Java обёртки для всех сконфигурированных модулей.
Codegen и написание TurboModule
Codegen, это инструмент, который читает TypeScript спецификации модулей и компонентов и генерирует нативные обёртки. Для потребителя библиотек он работает автоматически. Для автора нативного модуля это обязательный шаг.
Минимальный TurboModule состоит из трёх файлов. Сначала спецификация в TypeScript:
Ключевое отличие от старой NativeModule, метод getTurboModule, который возвращает сгенерированный Codegen JSI‑биндинг. Именно этот вызов делает модуль полноценным TurboModule, а не совместимым бридж‑модулем через interop layer.
Типичные проблемы миграции и их решения
На шести проектах я собрал устойчивый список того, что ломается в первые сутки после включения новой архитектуры. Ниже самые частые случаи, начиная с того, на котором я сам потерял пол-вечера в одном из первых переходов.
Пустой экран на iOS без ошибок
Симптом: приложение запускается, JS bundle грузится, но белый экран. Причина в 90% случаев, UIViewController, вручную устанавливающий rootViewController старым способом. Решение: используйте RCTRootViewFactory из шаблона 0.76+.
Крэш при вызове модуля: «TurboModuleRegistry.getEnforcing failed»
Модуль зарегистрирован в старой архитектуре, но не найден в Codegen. Проверьте, что codegenConfig присутствует в package.json модуля и что pod install был выполнен после установки.
Странное поведение flexBasis и процентных размеров
Fabric использует обновлённый Yoga. Некоторые «ошибочно работающие» лейауты старого рендерера теперь считаются правильно и выглядят иначе. Обычно исправляется явной установкой flexShrink: 1 или minWidth: 0.
Анимации Reanimated замерли
Reanimated 4 требует явную инициализацию worklet‑рантайма в новой архитектуре. Обновитесь до 4.1+ и проверьте, что react-native-reanimated/plugin стоит последним в babel.config.js.
Долгая первая сборка Android
Не баг, а фича Codegen. Одноразовая цена в 3–5 минут. Последующие сборки быстрее, если не менять спецификации.
Измерения производительности: что реально меняется
Абстрактные обещания «быстрее» бессмысленны, я всегда меряю. Ниже сводка реальных замеров, которые я снимал на трёх проектах разного размера. Все цифры, median из 20 холодных стартов на iPhone 12 (iOS 18) и Pixel 6 (Android 15), Hermes включён на обеих архитектурах.
Метрика
Старая архитектура
New Architecture
Изменение
Холодный старт (iOS, среднее приложение)
1.9 с
1.4 с
–26%
Холодный старт (Android)
2.3 с
1.7 с
–26%
TTI (Time to Interactive)
2.4 с
1.8 с
–25%
JS FPS в скролле длинного списка
48 fps
58 fps
+21%
Синхронный вызов MMKV.getString
~4 мс (мост)
~0.05 мс (JSI)
–98%
Размер APK
18.2 МБ
18.7 МБ
+2.7%
Первая сборка Android
1:40
4:10
+150%
Главное, что стоит вынести из этой таблицы: выигрыш в холодном старте идёт не от JSI, а от ленивой инициализации TurboModules. Приложения с 5–10 нативными модулями получают +50–150 мс, приложения с 30–50 модулями до –500 мс. Синхронный JSI критически важен только для «горячих» операций вроде чтения ключа из MMKV в render‑функции, но и там 4 мс редко становится ботлнеком. Про то, как правильно измерять и профилировать эти цифры, у нас есть отдельное руководство по отладке и профилированию React Native в 2026.
Часто задаваемые вопросы
Обязательно ли переходить на New Architecture в 2026 году?
Технически на React Native 0.81 старую архитектуру ещё можно собрать, но команда ядра больше не исправляет в ней критические баги, а Expo SDK 53+ полностью убрал её поддержку. Если вы обновляетесь до актуальных версий, миграция обязательна. Проекты, замороженные на 0.72–0.74, могут пока подождать, но их окно поддержки быстро закрывается.
Как проверить, что New Architecture включена в моём приложении?
В рантайме проверьте global.RN$Bridgeless: если равно true, вы работаете в Bridgeless Mode новой архитектуры. Для более детальной диагностики запустите npx react-native config или npx expo-doctor, они покажут статус и предупредят о несовместимых зависимостях.
Что делать, если критическая библиотека не совместима?
Три пути в порядке предпочтения: поискать поддерживаемую замену в reactnative.directory, положиться на interop layer (работает в 0.76–0.81) или форкнуть библиотеку и добавить codegenConfig с минимальной TurboModule‑обёрткой. На практике я не помню проекта за последний год, где помог только третий путь.
Сколько времени занимает миграция среднего приложения?
Среднее приложение (100–200 экранов, 20–40 нативных модулей) с готовыми зависимостями мигрируется за 1–2 рабочих недели: пара дней на обновление RN/Expo, 3–4 дня на переписывание собственных нативных модулей под Codegen, остальное регресс‑тестирование. Если зависимости не готовы, прибавьте по 2–3 дня на каждый форк.
В чём разница между TurboModule и Fabric Native Component?
TurboModule, это замена нативных модулей (методы, которые вызываются из JS: доступ к камере, хранилищу, датчикам). Fabric Native Component, замена нативных UI‑компонентов (то, что рендерится как <View>: карты, видеоплееры, кастомные графики). Оба используют Codegen, но спецификации разные: type: 'modules' против type: 'components'.
Настраиваем push-уведомления в React Native с нуля: expo-notifications, FCM v1 API, APNs, каналы Android, deep linking и отправка с сервера. Рабочие примеры для Expo SDK 52+.