Bridgeless = bỏ hoàn toàn Bridge legacy. Mọi native interop chuyển sang JSI/Fabric/TurboModules.
Trước Bridgeless (RN 0.68–0.73, dù đã có New Arch):
- Bridge vẫn chạy song song để hỗ trợ legacy modules.
- JS thread vẫn share queue cũ với native.
- Vẫn có overhead dù nhiều phần đã chạy JSI.
Bridgeless (giới thiệu RN 0.74, default từ RN 0.76+):
- Không còn RCTBridge instance.
- App khởi động qua RCTHost (iOS) / ReactHost (Android) — manages JSI runtime, TurboModule registry, Fabric Surface.
- Mọi legacy NativeModule không TurboModule-compat sẽ không hoạt động → buộc migrate hoặc tìm replacement.
- Startup nhanh hơn 20–30% trên Android low-end.
- Memory footprint giảm vì không còn 2 bộ infrastructure song song.
Code thay đổi:
// AppDelegate.mm — iOS new-style
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.moduleName = @"MyApp";
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}App template Expo/RN CLI mới đã setup sẵn.
Lưu ý: lib chưa migrate sẽ crash hoặc throw "TurboModuleRegistry: 'MyOldModule' could not be found." Lúc đó:
1. Update lib lên version mới nhất.
2. Nếu lib không còn maintain, fork và migrate sang TurboModule spec.
3. Tạm thời unstable_enableSyncTurboModule workaround (deprecated, sẽ remove).
Bridgeless = the legacy Bridge is gone entirely. All native interop runs over JSI/Fabric/TurboModules.
Before Bridgeless (RN 0.68–0.73, even with the New Architecture):
- The Bridge still ran alongside to support legacy modules.
- The JS thread still shared the old queue with native.
- Overhead remained even though many paths used JSI.
Bridgeless (introduced in RN 0.74, default from RN 0.76+):
- No more RCTBridge instance.
- The app boots via RCTHost (iOS) / ReactHost (Android) — managing the JSI runtime, TurboModule registry, and Fabric Surface.
- Any legacy NativeModule that is not TurboModule-compatible stops working — forcing migration or replacement.
- Startup is 20–30% faster on low-end Android.
- Memory footprint shrinks because there is no longer two parallel infrastructures.
Code changes:
// AppDelegate.mm — iOS new style
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.moduleName = @"MyApp";
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}New Expo/RN CLI templates already set this up.
Pitfall: unmigrated libraries crash or throw "TurboModuleRegistry: 'MyOldModule' could not be found." Fixes:
1. Update the library to the latest version.
2. If unmaintained, fork and migrate to a TurboModule spec.
3. Temporary unstable_enableSyncTurboModule workaround (deprecated, will be removed).