React Native's New Architecture eliminates the async bridge bottleneck that plagued performance since day one.
Old Bridge vs New Architecture
Old: JS → async JSON bridge → Native (bottleneck for every call) New: JSI (direct C++ calls) + Fabric (synchronous layout) + TurboModules (lazy loading)
// New: TurboModule — synchronous when needed
import { TurboModuleRegistry } from 'react-native'
const BiometricModule = TurboModuleRegistry.getEnforcing('BiometricModule')
const isAvailable = BiometricModule.isAvailableSync() // No callback needed!
Reanimated 3: Animations on UI Thread
import Animated, {
useSharedValue, useAnimatedStyle, withSpring,
withTiming, runOnJS, useDerivedValue, interpolate, Extrapolation
} from 'react-native-reanimated'
import { Gesture, GestureDetector } from 'react-native-gesture-handler'
function SwipeableCard({ onDismiss }) {
const translateX = useSharedValue(0)
const SCREEN_WIDTH = Dimensions.get('window').width
const panGesture = Gesture.Pan()
.onUpdate((e) => { translateX.value = e.translationX })
.onEnd((e) => {
const shouldDismiss = Math.abs(e.translationX) > SCREEN_WIDTH * 0.4
if (shouldDismiss) {
translateX.value = withTiming(
Math.sign(e.translationX) * SCREEN_WIDTH * 1.5, {},
() => runOnJS(onDismiss)()
)
} else {
translateX.value = withSpring(0)
}
})
const rotation = useDerivedValue(() =>
interpolate(translateX.value, [-SCREEN_WIDTH/2, 0, SCREEN_WIDTH/2],
[-15, 0, 15], Extrapolation.CLAMP)
)
const style = useAnimatedStyle(() => ({
transform: [{ translateX: translateX.value }, { rotate: `${rotation.value}deg` }]
}))
return (
<GestureDetector gesture={panGesture}>
<Animated.View style={[styles.card, style]}>
<CardContent />
</Animated.View>
</GestureDetector>
)
}
FlashList vs FlatList
FlatList recycles components poorly. FlashList (Shopify) is a direct replacement.
import { FlashList } from '@shopify/flash-list'
function ProductList({ products, onLoadMore }) {
return (
<FlashList
data={products}
renderItem={({ item }) => <ProductCard product={item} />}
keyExtractor={(item) => item.id}
estimatedItemSize={120} // Critical: estimate item height
drawDistance={500} // Pre-render 500px outside viewport
onEndReachedThreshold={0.5}
onEndReached={onLoadMore}
/>
)
}
Breaking Long Tasks
async function processLargeDataset(items) {
const results = []
const CHUNK_SIZE = 50
for (let i = 0; i < items.length; i += CHUNK_SIZE) {
results.push(...processChunk(items.slice(i, i + CHUNK_SIZE)))
await new Promise(resolve => setImmediate(resolve)) // Yield to UI thread
}
return results
}
Metro Bundle Optimization
// metro.config.js
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: { inlineRequires: true }, // Defer module loading
}),
},
}
The New Architecture is default in new React Native projects. Reanimated 3 + FlashList are the highest-impact upgrades for existing apps.
→ Parse your deep link URLs with the URL Parser tool.