NativeModules cũ:
- Register tất cả module ngay lúc app start → tốn memory/startup time dù chưa dùng.
- Mọi method call async (Promise/callback) qua bridge.
- API định nghĩa qua RCTBridgeModule (iOS Obj-C) / ReactContextBaseJavaModule (Android) — không type-safe, JS phải nhớ chính xác signature.
- Hệ quả: app có 100 module, dù dùng 10, vẫn pay cost startup cho 100.
TurboModules:
- Lazy load: chỉ load module khi gọi đến lần đầu (require('NativeFoo').foo() → load native binding tại runtime).
- Sync call qua JSI: getNumber() return number ngay, không Promise. (Async vẫn được khi cần I/O.)
- Type-safe: Codegen sinh code C++/Java/Obj-C từ TypeScript spec → JS gọi sai signature → compile error.
- Backward compat: API JS có thể giữ giống module cũ — migrate dần.
Spec file (TypeScript):
// NativeCalculator.ts
import { TurboModule, TurboModuleRegistry } from 'react-native'
export interface Spec extends TurboModule {
add(a: number, b: number): number
fetchUser(id: string): Promise<{ name: string; age: number }>
}
export default TurboModuleRegistry.getEnforcing<Spec>('Calculator')Codegen đọc spec → tự sinh:
- iOS: RCTCalculatorSpec.h/.mm (Obj-C/C++ glue).
- Android: CalculatorSpec.java/.kt.
Native implement chỉ cần extends spec → mọi điểm khớp.
Performance: TurboModule call ~100× nhanh hơn legacy module call vì không serialize, không queue.