Fabric, React Native’in yeni rendering sistemidir (UI’nin ekrana çizilme katmanı). Eski Paper renderer’ın “JS’den bridge ile UIManager komutları” modelinin yerine C++ merkezli bir shadow tree (görünüm ağacının C++ kopyası) ve daha sıkı thread sözleşmesi koyar.
Turbo Modules native API’yi modernleştirir; Fabric olmadan New Architecture UI tarafında tamamlanmaz. Biri veri/API, diğeri çizim.
Paper renderer’ın tavanı
Paper döneminde layout ve view komutları büyük ölçüde asenkron bridge trafiğine bağlıydı. Üç yapısal gerilim birikti:
- Concurrent React ile uyumsuzluk: Kesilebilir rendering, “tek yönlü komut kuyruğu” ile gerilim yaratıyordu.
- Tree drift: JS tree ile native view hiyerarşisi arasında gecikme; “hangi tree doğru?” bug’ları.
- Yüksek frekanslı güncelleme: Gesture ve scroll-linked animasyon batching’e takılıyordu.
Fabric’in cevabı: ortak C++ shadow tree ve host platform view’larına kontrollü, transactional mount.
Temel kavramlar
Shadow Node
Her RN bileşeninin C++ tarafındaki karşılığıdır. Props, children, layout girdileri burada yaşar. Yoga (layout motoru) shadow tree üzerinde çalışır — JS thread’de değil.
Prop değişikliği yeni node veya clone üretir. Mutable shared state varsaymak Fabric’te bug üretir.
Component Descriptor
Belirli bir component tipi için factory, prop parsing ve clone davranışını tanımlar. Codegen, custom native component Spec’inizden descriptor iskeleti üretir. Descriptor olmadan Fabric custom view’ı tanımaz.
Mounting layer
Shadow tree commit sonucunu platform view’lara (Android View, iOS UIView) uygulayan katmandır. Mümkün olduğunca UI thread’de, tutarlı transactional model ile çalışır. Gereksiz view create/destroy azaltılır.
Scheduler / UIManager
Commit’leri koordine eder; React güncellemelerini shadow tree’ye işler. React 18 concurrent features ile entegre çalışmak üzere tasarlandı.
Concurrent React ile ilişki
Fabric, React 18 concurrent modeliyle çalışmak üzere tasarlandı. Pratikte beklenenler:
- Tree drift azalır
- Suspense / transition için daha gerçekçi zemin
- Gesture → layout → paint yolu daha tutarlı timing
Beklenmemesi gerekenler:
- Sihirli FPS — ağır JS hâlâ frame çalar
- Bitmap/image decode ayrı problem
- Kötü list virtualization hâlâ kritik
Ölçüm: UI FPS ve JS FPS ayrı izleyin.
Custom native component: Spec zorunluluğu
View istiyorsanız Turbo Module yetmez — Fabric component Spec yazarsınız:
import type { ViewProps } from 'react-native';
import type { HostComponent } from 'react-native';
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
export interface NativeMapViewProps extends ViewProps {
zoomEnabled?: boolean;
onRegionChange?: (event: { nativeEvent: { lat: number; lng: number } }) => void;
}
export default codegenNativeComponent<NativeMapViewProps>(
'NativeMapView'
) as HostComponent<NativeMapViewProps>;
Android/iOS’ta generated interop’a karşı view manager bağlarsınız. Eski requireNativeComponent interop ile yaşayabilir — third-party Fabric desteğini envanterleyin.
Event prop
Fabric’te event prop’ları codegen ile tip güvenli tanımlanır. directEventHandler scroll-linked callback’lerde tercih edilir; bubbling seçimi performansı etkiler.
Performans: gerçekçi beklenti
| Alan | Fabric kazancı | Fabric yetmez |
|---|---|---|
| Gesture + scroll | Daha tutarlı mount | JS re-render hâlâ pahalı |
| Layout animation | Daha az bridge drift | Yanlış Reanimated config |
| Concurrent update | Daha iyi önceliklendirme | Ağır sync Turbo Module |
| Custom native view | Codegen descriptor | Eski Paper-only view manager |
| List performansı | Temel iyileşme | Virtualization tuning şart |
Baseline alın: Paper vs Fabric, aynı cihaz, aynı ekran. “Daha akıcı” anekdotu yetmez.
Sık tuzaklar
newArchEnabled=trueaçıp third-party Fabric desteğini kontrol etmemekUIManager.measuretiming değişikliği — Paper’dan farklı frame’de gelebilir- Shadow node’da mutable state varsayımı
- Reanimated + Fabric uyumsuz eski sürüm
- Sadece flagship test — düşük segment Android farklı davranır
Production checklist
- Kritik native view’lar Fabric-compatible
- Codegen Spec’leri release build’de üretiliyor
- Gesture + scroll E2E
- Reanimated uyumu doğrulandı
- UI FPS + JS FPS baseline
- Paper’a rollback binary planı var
- Event prop’ları direct/bubbling doğru
- R8 açık smoke — generated descriptor sınıfları
Özet
Fabric, RN UI’sini “mesaj gönderen JS” olmaktan çıkarıp paylaşılan C++ tree + mount protokolüne taşır. Turbo Modules API hızını, Fabric çizim tutarlılığını getirir. Renderer’ı anlamadan “New Arch açtık” demek yarım migrasyondur — pahalı bug’lar çoğu zaman mount timing’de yaşanır.