Turbo Module a React Native-ban — mi ez, hogyan működik a JSI és az architektúra

Szerző: IT Sectr Megjelenés: 2026-06-04 Olvasási idő: 10 perc

A Turbo Module a React Native natív moduljainak evolúciója, amely a JavaScript Interface (JSI) segítségével épül fel. A Bridge-től eltérően a Turbo Module szinkronban működik és JSON-szerializáció nélkül, ami jelentős teljesítménynövekedést eredményez. A Meta Engineering Blog, 2024 szerint a Turbo Module az új architektúra kulcsfontosságú összetevője, és elérhető a React Native 0.76+-ban.

Főbb pontok

  • Turbo Module — natív React Native modul JSI alapokon, Bridge nélkül.
  • JSI — JavaScript Interface, amely lehetővé teszi a C++ metódusok közvetlen meghívását JS-ből.
  • Szinkronitás — a Turbo Module támogatja a szinkron hívásokat szerializáció nélkül.
  • Lusta betöltés — a modulok csak az első JS-ből történő hozzáféréskor töltődnek be.
  • Codegen — a típusok és interfészek automatikusan generálódnak a specifikációkból.

Mi az a Turbo Module?

A Turbo Module a React Native új architektúrájának összetevője, amely a klasszikus Bridge-t helyettesíti a JavaScript és a natív kód közötti interakcióban. A Bridge-től eltérően, ahol minden üzenet JSON-ba szerializálódik és aszinkron módon kerül elküldésre, a Turbo Module a JSI-t használja — egy közbenső réteget, amely lehetővé teszi a JavaScript számára a C++-ban írt függvények közvetlen meghívását.

A Turbo Module architektúrát a Meta csapata mutatta be a React Conf 2021-en, a React Native nagyobb mértékű átalakításának részeként, „The New Architecture“ kódnéven. A Turbo Module mellett az új architektúra tartalmazza a Fabric-ot (új renderelő), a Codegen-t (kódgenerátor) és a JSI-t (kommunikációs interfész). Ezek az összetevők együtt oldják meg a React Native-ban 2015 óta felhalmozódott teljesítményproblémákat.

A Turbo Module három kulcsfontosságú problémát old meg a klasszikus natív modulokkal kapcsolatban: aszinkronitást (minden hívás soron keresztül megy), szerializációt (minden hívás JSON-konverziót igényel) és betöltést (minden modul inicializálódik az alkalmazás indításakor). A Turbo Module segítségével a natív metódusok szinkron módon hívhatók meg, az adatok másolás nélkül kerülnek átvitelre, és a modulok igény szerint töltődnek be.

Hogyan működik a JSI

A JSI (JavaScript Interface) egy C++ API, amely közbenső réteget hoz létre a JavaScript motor (Hermes vagy JSC) és a natív kód között. A JSI host-objektumokat biztosít — C++ objektumokat, amelyek úgy néznek ki, mint a hétköznapi JavaScript objektumok és metódusok. Amikor a JavaScript meghív egy ilyen objektum metódusát, a JSI közvetlenül végrehajtja a megfelelő C++ kódot szerializáció és szálváltás nélkül.

A JSI és a Bridge közötti kulcsfontosságú különbség — az adatmásolás hiánya. A Bridge-ben minden érték JSON-ba szerializálódik, egy soron keresztül kerül elküldésre, majd deszerializálódik. A JSI mutatókat ad át a memóriában lévő adatokhoz, ami lehetővé teszi a nagy adatmennyiségekkel való munkát teljesítményveszteség nélkül. A Meta tesztjei szerint a JSI hívások 5–10-szer gyorsabbak, mint a Bridge-en keresztüli hasonló hívások.

HostObject és szinkron hívások

A JSI meghatározza a HostObject interfészt — egy C++ osztályt, amelyet a React Native egy hétköznapi objektumként regisztrál a JS környezetben. Amikor a JS kód hozzáfér egy HostObject tulajdonságához vagy meghívja annak metódusát, a JSI elfogja a hívást és végrehajtja a C++ kódot. Ez lehetővé teszi a műveletek szinkron végrehajtását, a Bridge sorára való várakozás nélkül.

cpp
// JSI HostObject példa — szinkron natív hívás
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();
    }
};

A fenti kód bemutatja, hogyan dolgozza fel a JSI HostObject a compressImage hívást JavaScript-ből. A függvény két argumentumot (útvonal sztring és minőségi szám) fogad, meghívja a compressNative natív függvényt, és visszaadja az eredményt — mindezt szinkronban, Bridge és JSON nélkül. Ez a JSI legfontosabb előnye a klasszikus architektúrával szemben.

A JSI a React Native fő futásidejének része, és nem függ az adott JavaScript motortól. Mind a Hermes-szel, mind a JavaScriptCore-ral (JSC) működik, egységes interfészt biztosítva a natív környezettel való kommunikációhoz.

Turbo Module vs Bridge: összehasonlítás

A Turbo Module és a Bridge összehasonlítása megmutatja a React Native architektúra evolúcióját. A Bridge a React Native gyors elindítására készült 2015-ben, de az alkalmazások összetettségének növekedésével a korlátai kritikussá váltak. A Turbo Module ezeket a problémákat architektúra szinten oldja meg.

JellemzőBridgeTurbo Module
Hívás sebessége5–15 ms többlet0.1–0.5 ms többlet
SzinkronitásCsak aszinkronSzinkron és aszinkron
SzerializációJSON minden hívásnálJSI objektumok másolás nélkül
TípusbiztonságNemCodegen + TypeScript
InicializálásMinden modul induláskorLusta, igény szerint

A gyakorlatban a különbség a natív metódusok gyakori hívásainál a legszembetűnőbb — például médiafeldolgozásnál vagy GPU-val való munka során. Ritka hívásoknál (munkamenetenként egyszer) a teljesítménykülönbség elhanyagolható. A Turbo Module emellett leegyszerűsíti a nagy bináris adatokkal — képekkel, videókkal, bináris protokollokkal — való munkát, amelyek a Bridge-ben fájlrendszeres megoldásokat igényeltek.

Példa Turbo Module létrehozására

A Turbo Module létrehozása a specifikáció TypeScript-ben történő meghatározásával kezdődik. A Codegen automatikusan generál C++ interfészeket és Objective-C/Java stub-okat a specifikáció alapján. Ez teljesen megváltoztatja a fejlesztési megközelítést — a fejlesztő egyszer leírja az API-t, a Codegen pedig létrehozza a többit.

typescript
// ImageCompressor.ts — Turbo Module specifikáció
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>;
}

Kódgenerálás a Codegen segítségével

A Codegen elemzi a TypeScript specifikációt, és C++ HostObject-t, Objective-C protokollt és Java interfészt generál. A fejlesztőnek csak a natív logikát kell implementálnia. Ez a megközelítés garantálja, hogy a típusok a JavaScript és a natív oldalon mindig megegyeznek, kiküszöbölve a kézi leképezés hibáit.

objective-c
// TurboModule implementáció iOS-re (generált 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

Fontos előny — lusta betöltés. A Turbo Module nem inicializálódik az alkalmazás indításakor, hanem csak az első JavaScript-ből történő hozzáféréskor jön létre. Ez 30–50%-kal csökkenti az alkalmazás indítási idejét a klasszikus megközelítéshez képest, ahol az összes natív modul azonnal betöltődik.

Migráció Bridge-ről Turbo Module-ra

A Bridge-ről Turbo Module-ra való áttérés nem igényli az alkalmazás teljes újraírását. A React Native 0.73+ párhuzamosan támogatja mindkét architektúrát — a Bridge modulok továbbra is működnek, és az új modulok Turbo Module-ként hozhatók létre. Ez lehetővé teszi a fokozatos, modulonkénti migrációt.

Az új architektúra engedélyezéséhez egy React Native 0.76+ projektben állítsa a newArchEnabled jelzőt true értékre a react-native.config.js fájlban. Ezt követően az összes meglévő natív modul továbbra is a Bridge-en keresztül működik, az új modulok pedig Turbo Module-ként hozhatók létre. A Codegen automatikusan feldolgozza mindkét változatot.

js
// react-native.config.js — új architektúra engedélyezése
module.exports = {
  project: {
    ios: {},
    android: {},
  },
  assets: [],
  newArchEnabled: true,
};

Javasolt a migrációt a JavaScript-ből leggyakrabban hívott modulokkal kezdeni — ezek fogják a legnagyobb teljesítménynövekedést elérni. A ritkán hívott modulok (munkamenetenként egyszer) jelentős teljesítményveszteség nélkül a Bridge-en hagyhatók.

  • Codegen — használjon TypeScript specifikációkat a natív interfészek automatikus generálásához.
  • E2E tesztek — ellenőrizze a modulok működését mindkét architektúrán, különösen a React Native frissítés után.
  • Tartalék terv — ha probléma adódik a Turbo Module-lal, ideiglenesen visszatérhet a Bridge-hez egy konfigurációs jelző segítségével.

Gyakran ismételt kérdések

Használható a Turbo Module React Native 0.72-ben?

Nem, a Turbo Module React Native 0.73+-t igényel bekapcsolt új architektúrával. A 0.76-os verziótól kezdve az új architektúra stabil lett, és production projektekhez ajánlott.

A Turbo Module iOS-en és Androidon is működik?

Igen, a Turbo Module mindkét platformot támogatja. A JSI egy platformok közötti C++ réteg, a Codegen pedig Objective-C és Java stub-okat generál iOS-re és Androidra.

Kötelező a Hermes használata a Turbo Module-lal?

Nem, a Turbo Module bármely JS motorral működik a JSI-n keresztül. A Hermes azonban ajánlott, mert optimalizálva van a JSI-vel és az új React Native architektúrával való munkára.

Hogyan lehet hibakeresni a Turbo Module-t?

A Turbo Module hibakeresése Xcode-on vagy Android Studio-n keresztül történik, mint a hétköznapi natív kód esetében. Emellett a Flipper is elérhető a JSI hívások és a modulok teljesítményének nyomon követésére.

Növeli a Turbo Module az alkalmazás méretét?

A Turbo Module gyakorlatilag nem befolyásolja az alkalmazás méretét. A JSI C++ kódja már része a React Native-nak, a generált kód pedig minimális — csak interfészek a logika többszörözése nélkül.

Összefoglalás

  • Turbo Module — a React Native natív moduljainak új típusa, amely JSI-n keresztül működik JSON szerializáció nélkül.
  • JSI — C++ réteg, amely biztosítja a natív metódusok közvetlen szinkron meghívását JavaScript-ből.
  • Sebesség — a Turbo Module hívások 5–10-szer gyorsabbak, mint a Bridge-en keresztüli hívások.
  • Lusta betöltés — a modulok csak az első hozzáféréskor inicializálódnak, felgyorsítva az alkalmazás indítását.
  • Codegen — natív interfészek automatikus generálása TypeScript specifikációkból.
  • Kompatibilitás — a React Native 0.73+ támogatja a Bridge és a Turbo Module párhuzamos működését.
  • Migráció — fokozatos átállás: frissítse a React Native-ot 0.76+-ra, kapcsolja be a newArchEnabled-et, hozzon létre új modulokat Turbo Module-ként.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is