Turbo Module React Native-in native modullarının JavaScript Interface (JSI) üzərində qurulmuş təkamülüdür. Bridge-dən fərqli olaraq, Turbo Module sinxron işləyir və JSON seriyalaşdırması tələb olunmur, bu da əhəmiyyətli performans artımı verir. Meta Engineering Blog, 2024-ə görə, Turbo Module yeni arxitekturanın əsas komponentidir və React Native 0.76+-da mövcuddur.
Əsas məqamlar
Turbo Module — React Native-in yeni arxitekturasının komponentidir, JavaScript-in native kodla əlaqəsi üçün klassik Bridge-i əvəz edir. Bridge-dən fərqli olaraq, hər mesaj JSON-a seriyalaşdırılır və asinxron ötürülür, Turbo Module isə JSI — JavaScript-ə birbaşa C++ dilində yazılmış funksiyaları çağırmağa imkan verən təbəqədən istifadə edir.
Turbo Module arxitekturası Meta komandası tərəfindən React Conf 2021-də “The New Architecture” kod adı altında React Native-in daha geniş miqyaslı yenidən qurulmasının bir hissəsi kimi təqdim edilmişdir. Turbo Module-dən əlavə, yeni arxitektura Fabric (yeni renderer), Codegen (kod generatoru) və JSI (kommunikasiya interfeysi) daxildir. Birlikdə bu komponentlər 2015-ci ildən React Native-də yığılan performans problemlərini həll edir.
Turbo Module klassik Native Module-lərin üç əsas problemini həll edir: asinxronluq (bütün çağırışlar növbədən keçir), seriyalaşdırma (hər çağırış JSON çevrilməsi tələb edir) və yükləmə (bütün modullar tətbiq başlayanda işə salınır). Turbo Module ilə native metodlar sinxron çağırılır, məlumatlar kopyalanmadan ötürülür və modullar tələb əsasında yüklənir.
JSI (JavaScript Interface) — JavaScript mühərriki (Hermes və ya JSC) ilə native kod arasında təbəqə yaradan C++ API-dir. JSI host-obyektlər — adi JavaScript obyektləri və metodları kimi görünən C++ obyektləri təmin edir. JavaScript belə bir obyektin metodunu çağırdıqda, JSI birbaşa müvafiq C++ kodunu seriyalaşdırma və thread keçidi olmadan icra edir.
JSI ilə Bridge arasında əsas fərq — məlumatların kopyalanmamasıdır. Bridge-də hər dəyər JSON-a seriyalaşdırılır, növbədən ötürülür və deseriyalaşdırılır. JSI yaddaşdakı məlumatlara göstəricilər ötürür, bu da böyük həcmli məlumatlarla performans itkisi olmadan işləməyə imkan verir. Meta-nın testlərinə görə, JSI çağırışları Bridge vasitəsilə analoji çağırışlardan 5–10 dəfə sürətlidir.
JSI HostObject interfeysini təyin edir — React Native-in JS mühitində adi obyekt kimi qeydiyyatdan keçirdiyi C++ sinfi. JS kodu HostObject-in xassəsinə müraciət etdikdə və ya metodunu çağırdıqda, JSI çağırışı ələ keçirir və C++ kodunu icra edir. Bu, Bridge növbəsini gözləmədən sinxron əməliyyatları yerinə yetirməyə imkan verir.
// JSI HostObject nümunəsi — sinxron native çağırış
class ImageCompressorHostObject : public jsi::HostObject {
jsi::Value get(
jsi::Runtime& rt,
const jsi::PropNameID& propName
) override {
auto name = propName.utf8(rt);
if (name == "compressImage") {
return jsi::Function::createFromHostFunction(
rt,
jsi::PropNameID::forUtf8(rt, name),
2,
[](jsi::Runtime& rt,
const jsi::Value& thisValue,
const jsi::Value* args,
size_t count) -> jsi::Value {
return jsi::Value(rt, compressNative(
args[0].asString(rt).utf8(rt),
args[1].asNumber()
));
}
);
}
return jsi::Value::undefined();
}
};
Yuxarıdakı kod JSI HostObject-in JavaScript-dən compressImage çağırışını necə emal etdiyini göstərir. Funksiya iki arqument qəbul edir (yol sətri və keyfiyyət nömrəsi), compressNative funksiyasını çağırır və nəticəni qaytarır — hamısı sinxron, Bridge və JSON olmadan. Bu, JSI-nin klassik arxitekturaya nisbətən əsas üstünlüyüdür.
JSI React Native əsas icra mühitinin bir hissəsidir və konkret JavaScript mühərrikindən asılı deyil. O, həm Hermes, həm də JavaScriptCore (JSC) ilə işləyir, native mühitlə əlaqə üçün vahid interfeys təmin edir.
Turbo Module və Bridge-in müqayisəsi React Native arxitekturasının təkamülünü göstərir. Bridge 2015-ci ildə React Native-in sürətli işə salınması üçün hazırlanmışdır, lakin tətbiqlərin mürəkkəbliyi artdıqca onun məhdudiyyətləri kritik hala gəlmişdir. Turbo Module bu problemləri arxitektura səviyyəsində həll edir.
| Xüsusiyyət | Bridge | Turbo Module |
|---|---|---|
| Çağırış sürəti | 5–15 ms overhead | 0.1–0.5 ms overhead |
| Sinxronluq | Yalnız asinxron | Sinxron və asinxron |
| Seriyalaşdırma | Hər çağırışda JSON | JSI obyektləri kopyalanmadan |
| Tip təhlükəsizliyi | Xeyr | Codegen + TypeScript |
| İnisiallaşdırma | Bütün modullar başlanğıcda | Tənbəl, tələb əsasında |
Praktikada fərq ən çox native metodların tez-tez çağırıldığı hallarda nəzərə çarpır — məsələn, media emalı və ya GPU ilə işləyərkən. Nadir çağırışlar (seansda bir dəfə) üçün performans fərqi əhəmiyyətsizdir. Turbo Module həmçinin böyük ikili məlumatlar — şəkillər, videolar, ikili protokollarla işi asanlaşdırır, Bridge-də bunlar fayl sistemi ilə əlavə həllər tələb edirdi.
Turbo Module yaratmaq TypeScript-də spesifikasiyanın təyin edilməsi ilə başlayır. Codegen bu spesifikasiya əsasında avtomatik olaraq C++ interfeysləri və Objective-C/Java stub-ları yaradır. Bu, inkişaf yanaşmasını tamamilə dəyişir — tərtibatçı API-i bir dəfə təsvir edir, Codegen isə qalanını yaradır.
// ImageCompressor.ts — Turbo Module spesifikasiyası
import type { TurboModule } from 'react-native';
import type { Double } from 'react-native/Libraries/Types/CodegenTypes';
export interface Spec extends TurboModule {
compressImage(
imagePath: string,
quality: Double
): Promise<string>;
}
Codegen TypeScript spesifikasiyasını təhlil edir və C++ HostObject, Objective-C protokolu və Java interfeysi yaradır. Tərtibatçıya yalnız native məntiqi tətbiq etmək qalır. Bu yanaşma JavaScript və native tərəfdə tiplərin həmişə uyğun olmasını təmin edir, əl ilə xəritələşdirmə səhvlərini aradan qaldırır.
// iOS üçün TurboModule tətbiqi (yaradılmış stub)
@interface ImageCompressorModule ()
RCT_EXPORT_MODULE(ImageCompressor)
@end
@implementation ImageCompressorModule
RCT_EXPORT_METHOD(compressImage:(NSString *)imagePath
quality:(NSNumber *)quality
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSData *compressed = [ImageProcessor compressAtPath:imagePath
quality:quality.doubleValue];
resolve([NSString stringWithUTF8String:compressed.UTF8String]);
}
@end
Vacib üstünlük — tənbəl yükləmədir. Turbo Module tətbiq başlayanda deyil, yalnız JavaScript-dən ilk müraciətdə yaradılır. Bu, bütün Native Module-lərin dərhal yükləndiyi klassik yanaşma ilə müqayisədə tətbiqin başlama müddətini 30–50% qısaldır.
Bridge-dən Turbo Module-ə keçid tətbiqin tam yenidən yazılmasını tələb etmir. React Native 0.73+ hər iki arxitekturanı paralel dəstəkləyir — Bridge modulları işləməyə davam edir, yeni modullar isə Turbo Module kimi yaradıla bilər. Bu, modul-modul tədricən keçid etməyə imkan verir.
React Native 0.76+ layihəsində yeni arxitekturanı aktivləşdirmək üçün react-native.config.js faylında newArchEnabled flagını true təyin edin. Bundan sonra bütün mövcud Native Module-lər Bridge vasitəsilə işləməyə davam edir, yeni modullar isə Turbo Module kimi yaradıla bilər. Codegen hər iki variantı avtomatik emal edir.
// react-native.config.js — yeni arxitekturanı aktivləşdir
module.exports = {
project: {
ios: {},
android: {},
},
assets: [],
newArchEnabled: true,
};
Keçidə JavaScript-dən ən tez-tez çağırılan modullardan başlamaq tövsiyə olunur — məhz onlar ən böyük performans artımını əldə edəcəklər. Nadir çağırılan modullar (seansda bir dəfə) əhəmiyyətli performans itkisi olmadan Bridge-də qala bilər.
Tez-tez verilən suallar
Xeyr, Turbo Module yeni arxitektura aktivləşdirilmiş React Native 0.73+ tələb edir. 0.76 versiyasından etibarən yeni arxitektura stabil olub və production layihələri üçün tövsiyə olunur.
Bəli, Turbo Module hər iki platformanı dəstəkləyir. JSI çoxplatformalı C++ təbəqəsidir, Codegen isə iOS və Android üçün müvafiq olaraq Objective-C və Java stub-ları yaradır.
Xeyr, Turbo Module JSI vasitəsilə istənilən JS mühərriki ilə işləyir. Bununla belə, Hermes tövsiyə olunur, çünki o, JSI və React Native-in yeni arxitekturası ilə iş üçün optimallaşdırılıb.
Turbo Module-in debug-u adi native kod kimi Xcode və ya Android Studio vasitəsilə aparılır. Əlavə olaraq, JSI çağırışlarını və modul performansını izləmək üçün Flipper mövcuddur.
Turbo Module tətbiqin ölçüsünə praktiki olaraq təsir etmir. JSI-nin C++ kodu artıq React Native-in tərkibinə daxildir, yaradılan kod isə minimaldır — yalnız məntiqi təkrarlamayan interfeyslər.
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