Bridge — React Native-in memarlıq komponentidir, JavaScript axını ilə iOS və Android nativ mühiti arasında asinxron rabitəni təmin edir. O, seriallaşdırılmış JSON mesajlarını növbə vasitəsilə ötürərək JS kodundan nativ API-ləri çağırmağa imkan verir. Meta, 2024 məlumatına görə, Bridge mövcud tətbiqlərin əsası olaraq qalır, baxmayaraq ki, performans baxımından JSI üzərində qurulmuş yeni memarlıqdan geri qalır.
Əsas məqamlar
Bridge (Körpü) — React Native-in əsas memarlıq elementidir, tətbiqin biznes məntiqinin icra olunduğu JavaScript axını ilə iOS və Android nativ axınları arasında ikitərəfli asinxron rabitəni təmin edir. React Native 2015-ci ildə buraxıldığı gündən Bridge JS kodunun platforma API-ləri — kamera, geolokasiya, fayl sistemi, bildirişlər və digər nativ imkanlarla qarşılıqlı əlaqəsinin yeganə yolu olaraq qalırdı.
Bridge memarlığı mesaj növbəsi (message queue) prinsipinə əsaslanır. JavaScript kodu nativ metodu çağırdıqda sorğu JSON sətrinə seriallaşdırılır, növbəyə yerləşdirilir və asinxron şəkildə nativ tərəfə göndərilir. Nativ kod sorğunu emal edir, müvafiq əməliyyatı yerinə yetirir və nəticəni eyni növbə vasitəsilə JS axınına qaytarır. Meta-nın React Conf 2021-dəki hesabatına görə, orta statistik tətbiqdə Bridge-dən saniyədə 10 000 mesaj keçir.
Bridge-in işində iştirak edən əsas axınlar: JavaScript Thread (JS kodunun icrası), Native Thread (nativ əməliyyatların icrası) və Shadow Thread (Yoga ilə maketin hesablanması). Hər bir axın müstəqil işləyir ki, bu da interfeysin cavabdehliyini təmin edir — nativ animasiyalar JS hesablamaları ilə bloklanmır.
Bridge rabitə üçün üç əsas mexanizmdən istifadə edir: MessageQueue, JSON seriallaşdırması və mesajların toplu göndərilməsi. MessageQueue — React Native-in daxili komponentidir, JS və nativ tərəf arasında çağırış növbəsini idarə edir. Hər bir nativ metod çağırışı növbəyə yerləşdirilir, seriallaşdırılır və performansın optimallaşdırılması üçün toplu şəkildə göndərilir.
MessageQueue toplu göndərmə prinsipi ilə işləyir: nativ metod çağırışları yığılır və hər 5–15 millisaniyədən bir qrup (batch) şəklində göndərilir. Bu, seriallaşdırma xərclərini azaldır, çünki bir neçə çağırış bir JSON paketinə yığılır. Nativ tərəfdə mesajlar deseriallaşdırılır və müvafiq modullara paylanır.
Nativ modullar makrolar və ya annotasiyalar vasitəsilə avtomatik qeydiyyatdan keçirilir. iOS-da RCT_EXPORT_MODULE makrosu, Android-də isə @ReactMethod annotasiyası istifadə olunur. React Native tətbiq işə salındıqda qeydiyyatdan keçmiş modulları skan edir və bütün mövcud metodların konfiqurasiya JSON xəritəsini qurur. Bu xəritə JS mühitinə ötürülür və JavaScript hansı metodların çağırıla biləcəyini öyrənir.
Məlumatlar aşağıdakı yolu keçir: JavaScript NativeModules.CalendarModule.createCalendarEvent() çağırır. Metod modul identifikatoru, metod adı və arqumentlərlə JSON mesajına seriallaşdırılır. Mesaj MessageQueue növbəsinə düşür. Nativ axında mesaj deseriallaşdırılır və müvafiq modula ötürülür. İcra nəticəsi geri seriallaşdırılır və Promise və ya callback kimi JS axınına göndərilir.
// JavaScript-dən Bridge vasitəsilə nativ modul çağırışı
import { NativeModules } from 'react-native';
const CalendarModule = NativeModules.CalendarModule;
CalendarModule.createCalendarEvent('Test Event', 'Office')
.then(eventId => {
console.log('Yaradılmış hadisə id:', eventId);
})
.catch(error => {
console.error('Uğursuz:', error);
});
Nativ tərəfdə iOS modulu RCT_EXPORT_MODULE makrosu olan Objective-C sinfi kimi görünür. Metod RCT_EXPORT_METHOD makrosu ilə ixrac edilir və React Native onu avtomatik olaraq Bridge-də qeydiyyatdan keçirir. Arqumentlər mövqeyə görə ötürülür və dəstəklənən JSON tiplərinə uyğun olmalıdır: NSString, NSNumber, NSArray, NSDictionary, BOOL.
// Bridge-də iOS Nativ Modul qeydiyyatı
@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
Bridge bir sıra əsas performans məhdudiyyətlərinə malikdir. Bunlardan əsası məcburi asinxronluq və seriallaşdırmadır. Hər bir nativ metod çağırışı məlumatları JSON sətrinə çevirir ki, bu da gecikmə yaradır və yaddaş sərf edir. Böyük həcmli məlumatlarla əməliyyatlar, məsələn, şəkillərin emalı və ya video ilə iş üçün bu darboğaza çevrilir.
JSON seriallaşdırması və deseriallaşdırması prosessor vaxtı və yaddaş tələb edir. Hər bir mesaj JS tərəfində sətrə çevrilməli, körpü vasitəsilə ötürülməli və nativ tərəfdə təhlil edilməlidir. Callstack (2022) testlərinə görə, Bridge vasitəsilə 10 000 ədəddən ibarət massivin seriallaşdırılması təxminən 30–50 millisaniyə çəkir ki, bu da yüksək tezlikli çağırışlar üçün qəbuledilməzdir.
Bridge böyük ikili məlumatların ötürülməsi üçün optimallaşdırılmayıb. Fotoşəkillər, audiofayllar və video axınları alternativ yanaşmalar tələb edir — məsələn, faylı diskə yazmaq və yolu sətir kimi ötürmək. Bu, fayl sisteminin oxunması və yazılması üçün əlavə xərclər yaradır.
Bu məhdudiyyətlərin dərk edilməsi Meta komandasını React Native-in yeni memarlığını inkişaf etdirməyə vadar etdi, burada Bridge JSI (JavaScript Interface) və Turbo Module ilə əvəz olunur. JSI nativ metodları birbaşa, seriallaşdırmadan çağırmağa imkan verir ki, bu da Bridge-in əsas çatışmazlığını aradan qaldırır.
Bridge və Turbo Module müqayisəsi memarlıq yanaşmalarında əsas fərqləri göstərir. Bridge JSON seriallaşdırması ilə asinxron mesaj növbəsindən istifadə edir, Turbo Module isə JSI — JavaScript və C++ arasında birbaşa interfeys vasitəsilə işləyir ki, bu da məlumatları çevirmədən nativ metodları sinxron çağırmağa imkan verir.
| Xüsusiyyət | Bridge | Turbo Module |
|---|---|---|
| Çağırış növü | Asinxron | Sinxron və asinxron |
| Seriallaşdırma | Hər çağırışda JSON | JSI obyektləri, kopyalamadan |
| Performans | Orta | Yüksək |
| Tipləmə | Dinamik | Statik (Codegen) |
| Yükləmə | Bütün modullar başlanğıcda | Tənbəl (tələb əsasında) |
Bridge və Turbo Module arasında seçim React Native versiyasından asılıdır. React Native 0.72 və daha köhnə layihələr üçün Bridge əsas mexanizm olaraq qalır. React Native 0.73-dən başlayaraq, Metro və yeni memarlıq paralel olaraq dəstəklənir, tədricən miqrasiyaya imkan verir. Turbo Module-ə tam keçid React Native 0.76+-ya yenilənmə və konfiqurasiyada yeni memarlığın aktivləşdirilməsini tələb edir.
Təqvimlə işləmək üçün modul nümunəsində Bridge vasitəsilə Native Module yaradılması və istifadəsinin tam dövrünü nəzərdən keçirək. Modul hadisə yaradacaq və onun identifikatorunu qaytaracaq. Bu nümunə hər iki platforma — iOS və Android üçün qurulmanı əhatə edir.
Android-də Native Module ReactContextBaseJavaModule-dən miras alan Java sinfi kimi yaradılır. @ReactMethod annotasiyası metodu Bridge-ə ixrac edir. Promise üçün com.facebook.react.bridge-dən Promise interfeysi istifadə olunur.
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());
}
}
}
Modul @ReactModule vasitəsilə və ya əl ilə tətbiq paketində qeydiyyatdan keçirilir. React Native onu avtomatik aşkarlayır və Bridge-ə əlavə edir. Qeydiyyatdan sonra modul JavaScript-dən NativeModules vasitəsilə əlçatan olur.
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();
}
}
Qeyd etmək vacibdir ki, Bridge yeni modullar əlavə edilərkən tətbiqin yenidən başladılmasını tələb edir, çünki konfiqurasiya xəritəsi inisializasiya zamanı bir dəfə qurulur. Bu, onu tənbəl yüklənən və modulların yenidən başlatmadan hot-reloadını dəstəkləyən Turbo Module-dən fərqləndirir.
Tez-tez verilən suallar
Bridge həmişə asinxron növbə və JSON seriallaşdırmasından istifadə edir, JSI vasitəsilə birbaşa ötürmə isə sinxron və məlumatları kopyalamadan işləyir. Bridge seriallaşdırmada gecikmə yaradır, lakin axınların izolyasiyasını təmin edir.
Xeyr, Bridge yalnız asinxron çağırışları dəstəkləyir. Sinxron qarşılıqlı əlaqə üçün JSI və Turbo Module ilə yeni memarlıq tələb olunur. Bu, React Native 0.76+-da həll edilmiş əsas məhdudiyyətlərdən biridir.
Bridge JSON-a seriallaşdırıla bilən tipləri dəstəkləyir: sətirlər, ədədlər, məntiqi dəyərlər, massivlər, lüğətlər (obyektlər). Şəkillər kimi ikili məlumatlar fayl sistemi və ya base64 kodlaşdırması vasitəsilə ötürülməlidir.
Ölçmək üçün React DevTools və React Native profilatorundan istifadə edin. Performance bölməsi Bridge növbəsindəki mesajların sayını və gecikmələri göstərir. Trafikin monitorinqi üçün react-native-bridge-spy paketi də mövcuddur.
Yüksək performans tələb edən layihələrdə və ya React Native 0.76+-da yeni tətbiqlər yaratarkən keçid tövsiyə olunur. Mövcud layihələr üçün miqrasiya tədricən ola bilər — hər iki memarlıq paralel işləyir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun