Fabric в React Native — что это, архитектура рендеринга и как работает

Автор: IT Sectr Опубликовано: 2026-06-04 Время чтения: 10 мин

Fabric — это новый рендерер React Native, полностью переписанный на C++ и интегрированный с JSI. Он заменил старый рендеринг на основе UIView и ViewManager, обеспечивая синхронное обновление UI и эффективное вычисление изменений через Shadow Tree. По данным Meta Engineering Blog, 2024, Fabric является обязательным компонентом новой архитектуры и доступен в React Native 0.76+.

Главное

  • Fabric — новый C++ рендерер React Native, заменяющий старый UIView-рендеринг.
  • Shadow Tree — неизменяемое дерево узлов, позволяющее эффективно вычислять изменения.
  • Синхронность — Fabric рендерит UI синхронно, без асинхронной очереди Bridge.
  • Скорость — Fabric сокращает количество перерисовок и ускоряет отрисовку в 2–3 раза.
  • Интеграция — Fabric работает через JSI, обеспечивая единый C++ слой для iOS и Android.

Что такое Fabric?

Fabric — это новая система рендеринга для React Native, которая заменила старый рендерер, работавший через Shadow Thread и Bridge. В старой архитектуре процесс рендеринга включал три шага: JavaScript вычисляет Virtual DOM, Shadow Thread (Yoga) рассчитывает макет, Native Thread отрисовывает UIView. Fabric объединяет все эти шаги в едином C++ конвейере, работающем синхронно.

Разработка Fabric началась в 2019 году как часть инициативы Lean Core и проекта «The New Architecture». Основная цель — решить проблемы производительности, связанные с асинхронным трехраундовым рендерингом. В старой архитектуре каждое изменение состояния требовало трёх проходов через разные потоки, что создавало задержку между изменением данных и отрисовкой UI.

Fabric основан на концепции неизменяемого теневого дерева (Immutable Shadow Tree). Каждый узел дерева представляет собой React-компонент с его пропсами и состоянием. При изменении состояния создаётся новое дерево, а Fabric вычисляет разницу между старым и новым деревом и применяет только необходимые изменения к нативному UI. Это минимизирует количество операций с UIView/ViewGroup и сокращает время рендеринга.

Как работает Shadow Tree

Shadow Tree — это основа работы Fabric. В отличие от старой архитектуры, где Shadow Tree существовал только на C++ стороне и был отделён от JS-дерева через асинхронный Bridge, Fabric создаёт полностью синхронизированное иерархическое представление UI. Узлы Shadow Tree хранят пропсы, состояние и стили компонентов, а Yoga вычисляет макет непосредственно на C++ уровне.

Когда React-компонент обновляет своё состояние, React Native отправляет новый Shadow Node в Fabric. Fabric не перерисовывает весь UI — он использует алгоритм сравнения (diffing) на C++ уровне, чтобы определить, какие узлы изменились. Только изменённые узлы отправляются на нативный рендеринг, что значительно сокращает объём работы.

Трёхфазный рендеринг Fabric

Процесс рендеринга в Fabric состоит из трёх фаз, которые выполняются синхронно на C++ уровне без переключения потоков. Первая фаза — Render: React вызывает функцию рендера компонента, которая возвращает React Element Tree. Вторая фаза — Commit: React Native создаёт новое Shadow Tree и вычисляет изменения на основе старой версии. Третья фаза — Mount: Fabric применяет изменения к нативному UI, создавая, обновляя или удаляя UIView.

  • Render — выполняется на JS-потоке, создаёт React Element Tree.
  • Commit — C++ Shadow Tree вычисляет diff и формирует список мутаций.
  • Mount — мутации применяются к нативному UI на главном потоке.

Все три фазы работают как единый конвейер, где данные передаются через JSI без сериализации. Это ключевое отличие от старой архитектуры, где между фазами были разрывы: JS → (JSON) → Shadow Thread → (макет) → Native Thread.

Fabric vs старый рендерер: сравнение

Сравнение Fabric со старым рендерером демонстрирует, насколько существенно изменилась архитектура React Native. Старый рендерер работал асинхронно, разрывая процесс рендеринга на три независимых потока. Fabric объединяет всё в один C++ конвейер.

ХарактеристикаСтарый рендерерFabric
АрхитектураТри потока (JS, Shadow, Native)Единый C++ конвейер
СинхронностьАсинхронный рендерингСинхронный рендеринг
Shadow TreeИзменяемый, на каждом потоке своя копияНеизменяемый, единый
КаналыBridge + JSON сериализацияJSI + прямой C++ вызов
ПроизводительностьЗадержка до 16 мс на кадрЗадержка менее 1 мс на кадр

На практике Fabric особенно выигрышен для приложений с частыми обновлениями UI: анимации, скроллы с плавающими заголовками, real-time данные. Для статичных страниц (текст, кнопки) разница менее заметна. По данным бенчмарков Meta, Fabric сокращает время рендеринга начальной загрузки списка на 40–60%.

JSI и Fabric: новая коммуникация

JSI (JavaScript Interface) — это ключевой компонент, который делает Fabric возможным. Через JSI Fabric получает прямой доступ к JavaScript-значениям без сериализации. Когда React передаёт пропсы в Fabric, они не копируются через JSON — JSI передаёт указатели на данные в памяти JS-движка.

Архитектура JSI позволяет Fabric работать с любым JavaScript-движком — Hermes, JSC или V8. C++ код Fabric не зависит от конкретной реализации JS-движка, что упрощает поддержку и тестирование. Все операции с UI — создание, обновление, удаление — выполняются через JSI, что гарантирует минимальную задержку.

cpp
// Fabric C++ rendering pipeline via JSI
void mountShadowNode(
    jsi::Runtime& runtime,
    const ShadowNode::Shared& shadowNode,
    const ShadowNode::SharedList& children
) {
    auto props = shadowNode->getProps();
    auto state = shadowNode->getState();

    // Synchronous prop transfer via JSI
    jsiValue.asObject(runtime)
        .getProperty(runtime, "style")
        .asObject(runtime);

    // Layout calculation through Yoga directly
    auto layoutMetrics =
        YogaLayoutableShadowNode::layout(children);

    // Apply mutations to native UI
    UIManager::synchronouslyUpdateViewOnUIThread(
        shadowNode->getTag(), layoutMetrics
    );
}

Ключевое преимущество — синхронное обновление. В старой архитектуре UI обновлялся через асинхронную очередь: React отправлял команду через Bridge, Shadow Thread обрабатывал макет, Native Thread отрисовывал. В Fabric все шаги выполняются последовательно в одном проходе. Это устраняет race conditions и гарантирует, что UI соответствует текущему состоянию приложения.

Миграция на Fabric

Миграция на Fabric не требует переписывания React-компонентов — все существующие компоненты React Native продолжают работать. Однако библиотеки с нативным кодом (Native Module, кастомные ViewManager) могут потребовать обновления. Meta рекомендует проверять совместимость каждой библиотеки перед включением новой архитектуры.

Для включения Fabric в проекте React Native 0.76+ установите флаг newArchEnabled: true в react-native.config.js. Fabric включится автоматически вместе с Turbo Module. При возникновении проблем Fabric можно отключить, вернувшись к старому рендереру без изменения кода приложения — обе архитектуры поддерживаются параллельно.

js
// package.json — check Fabric-compatible libraries
"react-native": "0.76.6",
"react-native-safe-area-context": "^5.0.0",
"react-native-screens": "^4.0.0",
"react-native-reanimated": "^3.16.0",
"react-native-gesture-handler": "^2.21.0"

При миграции важно обновить все нативные библиотеки до версий, совместимых с Fabric. Крупные библиотеки, такие как react-native-reanimated и react-native-gesture-handler, уже поддерживают новую архитектуру. Для библиотек, которые ещё не обновлены, Fabric предоставляет механизм совместимости — если библиотека не поддерживает Fabric, рендерер автоматически переключается на старый для этой библиотеки.

Часто задаваемые вопросы

Fabric доступен в React Native Expo?

Да, начиная с Expo SDK 52 новая архитектура включается по умолчанию. Fabric и Turbo Module доступны в managed workflow без дополнительной настройки.

Улучшает ли Fabric производительность анимаций?

Fabric значительно улучшает анимации за счёт синхронного рендеринга. Анимации на JS-потоке больше не конкурируют с обработкой сообщений Bridge, что устраняет дёрганье и падение FPS.

Нужно ли переписывать UI-компоненты для Fabric?

Нет, все стандартные React Native компоненты работают с Fabric без изменений. Только кастомные ViewManager требуют обновления для поддержки новой архитектуры.

Как отключить Fabric и вернуться к старому рендереру?

Установите newArchEnabled: false в react-native.config.js и пересоберите приложение. Все модули и компоненты продолжат работать без изменений — Fabric и старый рендерер полностью взаимозаменяемы.

Что такое bridgeless mode в React Native?

Bridgeless mode — режим работы Fabric, в котором Bridge полностью отключён. Все коммуникации идут только через JSI, что даёт максимальную производительность. Доступен в React Native 0.76+.

Итоги

  • Fabric — новый C++ рендерер React Native, объединяющий расчёт макета и отрисовку UI в едином конвейере.
  • Shadow Tree — неизменяемое дерево теневых узлов, позволяющее эффективно вычислять изменения без полной перерисовки.
  • Синхронность — Fabric устраняет задержки, связанные с асинхронным рендерингом старой архитектуры.
  • JSI — Fabric использует прямой C++ интерфейс для передачи данных без JSON-сериализации.
  • Совместимость — Fabric поддерживает параллельную работу со старым рендерером для библиотек без новой архитектуры.
  • Производительность — время рендеринга списков сокращается на 40–60%, анимации работают плавнее.
  • Миграция — включение Fabric через флаг newArchEnabled, поддержка bridgeless mode для максимальной производительности.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также