Fabric — это новый рендерер React Native, полностью переписанный на C++ и интегрированный с JSI. Он заменил старый рендеринг на основе UIView и ViewManager, обеспечивая синхронное обновление UI и эффективное вычисление изменений через Shadow Tree. По данным Meta Engineering Blog, 2024, Fabric является обязательным компонентом новой архитектуры и доступен в React Native 0.76+.
Главное
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 — это основа работы Fabric. В отличие от старой архитектуры, где Shadow Tree существовал только на C++ стороне и был отделён от JS-дерева через асинхронный Bridge, Fabric создаёт полностью синхронизированное иерархическое представление UI. Узлы Shadow Tree хранят пропсы, состояние и стили компонентов, а Yoga вычисляет макет непосредственно на C++ уровне.
Когда React-компонент обновляет своё состояние, React Native отправляет новый Shadow Node в Fabric. Fabric не перерисовывает весь UI — он использует алгоритм сравнения (diffing) на C++ уровне, чтобы определить, какие узлы изменились. Только изменённые узлы отправляются на нативный рендеринг, что значительно сокращает объём работы.
Процесс рендеринга в Fabric состоит из трёх фаз, которые выполняются синхронно на C++ уровне без переключения потоков. Первая фаза — Render: React вызывает функцию рендера компонента, которая возвращает React Element Tree. Вторая фаза — Commit: React Native создаёт новое Shadow Tree и вычисляет изменения на основе старой версии. Третья фаза — Mount: Fabric применяет изменения к нативному UI, создавая, обновляя или удаляя UIView.
Все три фазы работают как единый конвейер, где данные передаются через JSI без сериализации. Это ключевое отличие от старой архитектуры, где между фазами были разрывы: JS → (JSON) → Shadow Thread → (макет) → Native Thread.
Сравнение 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 (JavaScript Interface) — это ключевой компонент, который делает Fabric возможным. Через JSI Fabric получает прямой доступ к JavaScript-значениям без сериализации. Когда React передаёт пропсы в Fabric, они не копируются через JSON — JSI передаёт указатели на данные в памяти JS-движка.
Архитектура JSI позволяет Fabric работать с любым JavaScript-движком — Hermes, JSC или V8. C++ код Fabric не зависит от конкретной реализации JS-движка, что упрощает поддержку и тестирование. Все операции с UI — создание, обновление, удаление — выполняются через JSI, что гарантирует минимальную задержку.
// 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 не требует переписывания React-компонентов — все существующие компоненты React Native продолжают работать. Однако библиотеки с нативным кодом (Native Module, кастомные ViewManager) могут потребовать обновления. Meta рекомендует проверять совместимость каждой библиотеки перед включением новой архитектуры.
Для включения Fabric в проекте React Native 0.76+ установите флаг newArchEnabled: true в react-native.config.js. Fabric включится автоматически вместе с Turbo Module. При возникновении проблем Fabric можно отключить, вернувшись к старому рендереру без изменения кода приложения — обе архитектуры поддерживаются параллельно.
// 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, рендерер автоматически переключается на старый для этой библиотеки.
Часто задаваемые вопросы
Да, начиная с Expo SDK 52 новая архитектура включается по умолчанию. Fabric и Turbo Module доступны в managed workflow без дополнительной настройки.
Fabric значительно улучшает анимации за счёт синхронного рендеринга. Анимации на JS-потоке больше не конкурируют с обработкой сообщений Bridge, что устраняет дёрганье и падение FPS.
Нет, все стандартные React Native компоненты работают с Fabric без изменений. Только кастомные ViewManager требуют обновления для поддержки новой архитектуры.
Установите newArchEnabled: false в react-native.config.js и пересоберите приложение. Все модули и компоненты продолжат работать без изменений — Fabric и старый рендерер полностью взаимозаменяемы.
Bridgeless mode — режим работы Fabric, в котором Bridge полностью отключён. Все коммуникации идут только через JSI, что даёт максимальную производительность. Доступен в React Native 0.76+.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также