Bridge — ay isang arkitektural na bahagi ng React Native na nagbibigay ng asynchronous na komunikasyon sa pagitan ng JavaScript thread at native na kapaligiran ng iOS at Android. Nagpapadala ito ng mga serialized na JSON na mensahe sa pamamagitan ng queue, na nagpapahintulot sa pagtawag ng mga native API mula sa JS code. Ayon sa Meta, 2024, ang Bridge ay nananatiling pundasyon ng mga kasalukuyang aplikasyon, bagama't ito ay mas mababa sa pagganap kumpara sa bagong arkitektura na nakabatay sa JSI.
Mga Pangunahing Punto
Bridge (Tulay) — ay isang pangunahing elemento ng arkitektura ng React Native na nagbibigay ng dalawang-daanan asynchronous na komunikasyon sa pagitan ng JavaScript thread, kung saan isinasagawa ang business logic ng aplikasyon, at ng mga native thread ng iOS at Android. Mula nang ilabas ang React Native noong 2015, ang Bridge ay nanatiling tanging paraan ng interaksyon ng JS code sa mga platform API — camera, geolokasyon, file system, notipikasyon, at iba pang native na kakayahan.
Ang arkitektura ng Bridge ay batay sa prinsipyo ng message queue. Kapag ang JavaScript code ay tumawag ng native method, ang kahilingan ay serialized sa isang JSON string, inilalagay sa queue, at asynchronous na ipinapadala sa native side. Pinoproseso ng native code ang kahilingan, isinasagawa ang kaukulang operasyon, at ibinabalik ang resulta sa pamamagitan ng parehong queue sa JS thread. Ayon sa ulat ng Meta sa React Conf 2021, hanggang 10,000 mensahe bawat segundo ang dumadaan sa Bridge sa isang karaniwang aplikasyon.
Ang mga pangunahing thread na kasangkot sa paggana ng Bridge: JavaScript Thread (pagpapatupad ng JS code), Native Thread (pagpapatupad ng native na operasyon), at Shadow Thread (pagkalkula ng layout gamit ang Yoga). Bawat thread ay gumagana nang independyente, na tinitiyak ang pagiging responsive ng interface — ang mga native na animation ay hindi nabablock ng JS computations.
Ang Bridge ay gumagamit ng tatlong pangunahing mekanismo para sa komunikasyon: MessageQueue, JSON serialisasyon, at pagpapangkat ng mga mensahe. Ang MessageQueue ay isang panloob na bahagi ng React Native na namamahala sa queue ng mga tawag sa pagitan ng JS at native side. Bawat tawag ng native method ay inilalagay sa queue, sineserialisa, at ipinapadala sa mga batch para sa pag-optimize ng pagganap.
Ang MessageQueue ay gumagana sa prinsipyo ng pagpapangkat: ang mga tawag ng native method ay naipon at ipinapadala bilang isang grupo (batch) bawat 5–15 millisecond. Binabawasan nito ang overhead ng serialisasyon dahil maraming tawag ang nakabalot sa isang JSON package. Sa native side, ang mga mensahe ay deserialized at ipinamamahagi sa mga kaukulang module.
Ang mga native module ay awtomatikong nirerehistro sa pamamagitan ng macros o annotations. Sa iOS, ginagamit ang macro na RCT_EXPORT_MODULE, sa Android — ang annotation na @ReactMethod. Sini-scan ng React Native ang mga nirehistrong module sa pagsisimula ng aplikasyon at gumagawa ng configuration JSON map ng lahat ng available na method. Ang map na ito ay ipinapadala sa JS environment, at nalalaman ng JavaScript kung anong mga method ang maaaring tawagin.
Ang data ay dumadaan sa sumusunod na landas: Tumatawag ang JavaScript ng NativeModules.CalendarModule.createCalendarEvent(). Ang method ay sineserialisa sa isang JSON message na may module identifier, method name, at arguments. Ang mensahe ay pumapasok sa MessageQueue. Sa native thread, ang mensahe ay deserialized at ipinapasa sa kaukulang module. Ang resulta ng pagpapatupad ay sineserialisa pabalik at ipinapadala sa JS thread bilang Promise o callback.
// Pagtawag ng native module mula sa JavaScript sa pamamagitan ng Bridge
import { NativeModules } from 'react-native';
const CalendarModule = NativeModules.CalendarModule;
CalendarModule.createCalendarEvent('Test Event', 'Office')
.then(eventId => {
console.log('Ginawa ang kaganapan na may id:', eventId);
})
.catch(error => {
console.error('Nabigo:', error);
});
Sa native side ng iOS, ang module ay mukhang isang Objective-C class na may macro na RCT_EXPORT_MODULE. Ang method ay ini-export gamit ang macro na RCT_EXPORT_METHOD, at awtomatiko itong nirerehistro ng React Native sa Bridge. Ang mga argument ay ipinapasa ayon sa posisyon at dapat tumugma sa mga suportadong JSON type: NSString, NSNumber, NSArray, NSDictionary, BOOL.
// Pagrehistro ng iOS Native Module sa Bridge
@interface CalendarModule () RCT_EXPORT_MODULE()
@end
@implementation CalendarModule
RCT_EXPORT_METHOD(createCalendarEvent:(NSString *)name
location:(NSString *)location
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSNumber *eventId = createEvent(name, location);
resolve(eventId);
}
@end
Ang Bridge ay may ilang pangunahing limitasyon sa pagganap. Ang pangunahin dito ay ang sapilitang asynchronisidad at serialisasyon. Bawat tawag ng native method ay ginagawang JSON string ang data, na nagdaragdag ng latency at kumukonsumo ng memorya. Para sa mga operasyon na may malaking volume ng data, tulad ng pagproseso ng imahe o pagtatrabaho sa video, ito ay nagiging bottleneck.
Ang JSON serialisasyon at deserialisasyon ay gumagamit ng oras ng processor at memorya. Bawat mensahe ay dapat gawing string sa JS side, ipadala sa pamamagitan ng tulay, at i-parse sa native side. Ayon sa mga pagsubok ng Callstack (2022), ang serialisasyon ng array na may 10,000 numero sa pamamagitan ng Bridge ay tumatagal ng mga 30–50 millisecond, na hindi katanggap-tanggap para sa high-frequency na mga tawag.
Ang Bridge ay hindi naka-optimize para sa pagpapadala ng malalaking binary data. Ang mga larawan, audio file, at video stream ay nangangailangan ng alternatibong approach — halimbawa, pagsulat ng file sa disk at pagpapadala ng path bilang string. Lumilikha ito ng karagdagang overhead para sa pagbasa at pagsulat ng file system.
Ang pagkakaroon ng kamalayan sa mga limitasyong ito ay nagdulot sa Meta team na bumuo ng bagong arkitektura ng React Native, kung saan ang Bridge ay pinapalitan ng JSI (JavaScript Interface) at Turbo Module. Pinapayagan ng JSI ang direktang pagtawag ng native method nang walang serialisasyon, na tinatanggal ang pangunahing kakulangan ng Bridge.
Ang paghahambing ng Bridge at Turbo Module ay nagpapakita ng mga pangunahing pagkakaiba sa mga arkitektural na approach. Gumagamit ang Bridge ng asynchronous na message queue na may JSON serialisasyon, habang ang Turbo Module ay gumagana sa pamamagitan ng JSI — isang direktang interface sa pagitan ng JavaScript at C++ na nagpapahintulot ng synchronous na pagtawag ng native method nang walang conversion ng data.
| Katangian | Bridge | Turbo Module |
|---|---|---|
| Uri ng tawag | Asynchronous | Synchronous at asynchronous |
| Serialisasyon | JSON sa bawat tawag | JSI objects nang walang pagkopya |
| Pagganap | Katamtaman | Mataas |
| Pagta-type | Dinamiko | Estatiko (Codegen) |
| Pag-load | Lahat ng module sa pagsisimula | Tamad (kapag hinihingi) |
Ang pagpili sa pagitan ng Bridge at Turbo Module ay depende sa bersyon ng React Native. Para sa mga proyekto sa React Native 0.72 at mas luma, ang Bridge ay nananatiling pangunahing mekanismo. Simula sa React Native 0.73, ang Metro at bagong arkitektura ay sinusuportahan nang paralelo, na nagpapahintulot ng gradual na migrasyon. Ang buong paglipat sa Turbo Module ay nangangailangan ng pag-update sa React Native 0.76+ at pag-activate ng bagong arkitektura sa configuration.
Tingnan natin ang buong cycle ng paggawa at paggamit ng Native Module sa pamamagitan ng Bridge gamit ang halimbawa ng module para sa pagtatrabaho sa kalendaryo. Ang module ay gagawa ng kaganapan at magbabalik ng identifier nito. Ang halimbawang ito ay sumasaklaw sa setup para sa parehong platform — iOS at Android.
Sa Android, ang Native Module ay ginagawa bilang isang Java class na nagmana mula sa ReactContextBaseJavaModule. Ang annotation na @ReactMethod ay nag-eexport ng method sa Bridge. Para sa Promise, ginagamit ang Promise interface mula sa com.facebook.react.bridge.
public class CalendarModule extends ReactContextBaseJavaModule {
@Override
public String getName() {
return "CalendarModule";
}
@ReactMethod
public void createCalendarEvent(
String name,
String location,
Promise promise) {
try {
Integer eventId = createCalendarEventNative(name, location);
promise.resolve(eventId);
} catch (Exception e) {
promise.reject("EVENT_ERROR", e.getMessage());
}
}
}
Ang module ay nirerehistro sa pamamagitan ng @ReactModule o mano-mano sa package ng aplikasyon. Awtomatiko itong nadedetect ng React Native at idinadagdag sa Bridge. Pagkatapos ng pagrehistro, ang module ay accessible mula sa JavaScript sa pamamagitan ng NativeModules.
public class CalendarPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
return Arrays.asList(
new CalendarModule(reactContext)
);
}
@Override
public List<ViewManager> createViewManagers(
ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
Mahalagang tandaan na ang Bridge ay nangangailangan ng pag-restart ng aplikasyon kapag nagdadagdag ng mga bagong module, dahil ang configuration map ay binuo nang isang beses sa panahon ng inisyalisasyon. Ito ang nagpapahiwalay dito mula sa Turbo Module, na naglo-load nang tamad at sumusuporta sa hot-reload ng mga module nang walang restart.
Mga Madalas Itanong
Ang Bridge ay palaging gumagamit ng asynchronous queue at JSON serialisasyon, habang ang direktang paglilipat sa pamamagitan ng JSI ay gumagana nang synchronous at walang pagkopya ng data. Ang Bridge ay lumilikha ng latency para sa serialisasyon, ngunit tinitiyak ang izolasyon ng mga thread.
Hindi, ang Bridge ay sumusuporta lamang ng asynchronous na mga tawag. Para sa synchronous na interaksyon, kinakailangan ang bagong arkitektura na may JSI at Turbo Module. Ito ay isa sa mga pangunahing limitasyon na nalutas sa React Native 0.76+.
Sinusuportahan ng Bridge ang mga uri na serializable sa JSON: mga string, numero, boolean, array, diksyunaryo (mga object). Ang binary data tulad ng mga imahe ay dapat ipadala sa pamamagitan ng file system o base64 encoding.
Para sa pagsukat, gamitin ang React DevTools at profiler ng React Native. Ang tab na Performance ay nagpapakita ng bilang ng mga mensahe sa Bridge queue at mga latency. Available din ang package na react-native-bridge-spy para sa pag-monitor ng trapiko.
Inirerekomenda ang paglipat para sa mga proyektong nangangailangan ng mataas na pagganap o kapag gumagawa ng mga bagong aplikasyon sa React Native 0.76+. Para sa mga umiiral na proyekto, ang migrasyon ay maaaring gradual — parehong arkitektura ay gumagana nang paralelo.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din