In a real app
For a custom native component, Fabric changes the contract: props are declared in a TypeScript spec, Codegen turns them into C++ structs, and a mismatch between the spec and the native view is a compile error instead of a silent production bug. It is more ceremony up front, but it is why “prop undefined on the native side” crashes are far rarer now.
The usual pitfalls show up in libraries that manipulated the view hierarchy directly or relied on asynchronous UIManager.measure. Under Fabric, measure and measureInWindow read the C++ shadow tree instead of asking the native view on the next frame, and code that relied on that delay can behave differently. Another one: setNativeProps still exists but no longer bypasses the renderer the way it did; an animation that depended on it should go through Reanimated or the shared animation backend, experimental since 0.85.1.
In practice I check whether the project’s native components expose a spec through codegenConfig, whether “not supported by Fabric” warnings show up in the logs, and whether the usual suspects (react-native-screens, react-native-svg, maps, video) are on a version that declares componentDescriptors. reactnative.directory (opens in a new window) lists Fabric support per library.
Related terms
New Architecture
The rewrite of React Native internals (Fabric, Turbo Modules, JSI), on by default since 0.76 and the only architecture since 0.82.
JSI (JavaScript Interface)
The C++ API that lets JavaScript hold direct references to native objects with no serialization: the foundation of the New Architecture.
Codegen
React Native’s build-time tool that generates the native glue (C++, Java, Objective-C++) from TypeScript or Flow spec files.
Bridgeless
The New Architecture runtime mode where the bridge is never instantiated: everything goes through JSI, Turbo Modules, and Fabric.