Turbo Module ist die Weiterentwicklung nativer React Native Module, die auf JavaScript Interface (JSI) basiert. Im Gegensatz zu Bridge arbeitet Turbo Module synchron und ohne JSON-Serialisierung, was eine deutliche Leistungssteigerung bringt. Laut Meta Engineering Blog, 2024 ist Turbo Module eine Schlüsselkomponente der neuen Architektur und in React Native 0.76+ verfügbar.
Das Wichtigste
Turbo Module ist eine Komponente der neuen React Native Architektur, die die klassische Bridge für die Kommunikation zwischen JavaScript und nativem Code ersetzt. Im Gegensatz zu Bridge, wo jede Nachricht in JSON serialisiert und asynchron übertragen wird, verwendet Turbo Module JSI — eine Schicht, die es JavaScript ermöglicht, direkt Funktionen aufzurufen, die in C++ geschrieben sind.
Die Turbo Module Architektur wurde vom Meta-Team auf der React Conf 2021 als Teil einer größeren Umstrukturierung von React Native unter dem Codenamen „The New Architecture“ vorgestellt. Neben Turbo Module umfasst die neue Architektur Fabric (neuer Renderer), Codegen (Codegenerator) und JSI (Interaktionsschnittstelle). Zusammen lösen diese Komponenten Leistungsprobleme, die sich seit 2015 in React Native angesammelt haben.
Turbo Module löst drei Schlüsselprobleme klassischer nativer Module: Asynchronität (alle Aufrufe durchlaufen eine Warteschlange), Serialisierung (jeder Aufruf erfordert eine JSON-Transformation) und Laden (alle Module werden beim App-Start initialisiert). Mit Turbo Module werden native Methoden synchron aufgerufen, Daten werden ohne Kopieren übertragen und Module werden bei Bedarf geladen.
JSI (JavaScript Interface) ist eine C++ API, die eine Schicht zwischen der JavaScript-Engine (Hermes oder JSC) und nativem Code erstellt. JSI stellt Host-Objekte bereit — C++ Objekte, die wie normale JavaScript-Objekte und -Methoden aussehen. Wenn JavaScript eine Methode eines solchen Objekts aufruft, führt JSI direkt den entsprechenden C++ Code ohne Serialisierung und ohne Thread-Wechsel aus.
Der Hauptunterschied zwischen JSI und Bridge ist das Fehlen von Datenkopien. In Bridge wird jeder Wert in einen JSON-String serialisiert, durch eine Warteschlange geleitet und deserialisiert. JSI übergibt Zeiger auf Daten im Speicher, was die Arbeit mit großen Datenmengen ohne Leistungseinbußen ermöglicht. Laut Meta-Tests sind JSI-Aufrufe 5–10 Mal schneller als äquivalente Aufrufe über Bridge.
JSI definiert das HostObject-Interface — eine C++ Klasse, die React Native in der JS-Umgebung als normales Objekt registriert. Wenn JS-Code auf eine Eigenschaft zugreift oder eine Methode von HostObject aufruft, fängt JSI den Aufruf ab und führt C++ Code aus. Dies ermöglicht die synchrone Ausführung von Operationen ohne Warten auf die Bridge-Warteschlange.
// JSI HostObject Beispiel — synchroner nativer Aufruf
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();
}
};
Der obige Code zeigt, wie JSI HostObject den Aufruf compressImage aus JavaScript verarbeitet. Die Funktion nimmt zwei Argumente entgegen (einen Pfad-String und eine Qualitätszahl), ruft die native Funktion compressNative auf und gibt das Ergebnis zurück — alles synchron, ohne Bridge, ohne JSON. Dies ist der Hauptvorteil von JSI gegenüber der klassischen Architektur.
JSI ist Teil der React Native Hauptlaufzeit und unabhängig von einer bestimmten JavaScript-Engine. Es funktioniert sowohl mit Hermes als auch mit JavaScriptCore (JSC) und bietet eine einheitliche Schnittstelle für die Interaktion mit der nativen Umgebung.
Der Vergleich von Turbo Module und Bridge zeigt die Entwicklung der React Native Architektur. Bridge wurde für den schnellen Start von React Native im Jahr 2015 entwickelt, aber mit zunehmender Komplexität der Anwendungen wurden seine Einschränkungen kritisch. Turbo Module löst diese Probleme auf Architekturebene.
| Eigenschaft | Bridge | Turbo Module |
|---|---|---|
| Aufrufgeschwindigkeit | 5–15 ms Overhead | 0,1–0,5 ms Overhead |
| Synchronität | Nur asynchron | Synchron und asynchron |
| Serialisierung | JSON bei jedem Aufruf | JSI-Objekte ohne Kopieren |
| Typsicherheit | Nein | Codegen + TypeScript |
| Initialisierung | Alle Module beim Start | Lazy, bei Bedarf |
In der Praxis ist der Unterschied am deutlichsten bei häufigen nativen Methodenaufrufen — zum Beispiel bei der Medienverarbeitung oder der Arbeit mit GPU. Bei seltenen Aufrufen (einmal pro Sitzung) ist der Leistungsunterschied unbedeutend. Turbo Module vereinfacht auch die Arbeit mit großen Binärdaten — Bildern, Videos, binären Protokollen — die in Bridge Workarounds mit dem Dateisystem erforderten.
Die Erstellung eines Turbo Module beginnt mit der Definition einer TypeScript-Spezifikation. Codegen generiert automatisch C++ Schnittstellen und Objective-C/Java-Stubs basierend auf dieser Spezifikation. Dies ändert den Entwicklungsansatz vollständig — der Entwickler beschreibt die API einmal und Codegen erstellt den Rest.
// ImageCompressor.ts — Turbo Module Spezifikation
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 analysiert die TypeScript-Spezifikation und generiert C++ HostObject, Objective-C-Protokoll und Java-Schnittstelle. Dem Entwickler bleibt nur die Implementierung der nativen Logik. Dieser Ansatz garantiert, dass Typen auf JavaScript- und nativer Seite immer übereinstimmen und schließt manuelle Mapping-Fehler aus.
// TurboModule Implementierung für iOS (generierter 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
Ein wichtiger Vorteil ist das Lazy Loading. Turbo Module wird nicht beim App-Start initialisiert, sondern erst beim ersten Zugriff aus JavaScript erstellt. Dies verkürzt die App-Startzeit um 30–50% im Vergleich zum klassischen Ansatz, bei dem alle nativen Module sofort geladen werden.
Der Übergang von Bridge zu Turbo Module erfordert kein vollständiges Umschreiben der Anwendung. React Native 0.73+ unterstützt beide Architekturen parallel — Bridge-Module arbeiten weiter und neue Module können als Turbo Module erstellt werden. Dies ermöglicht eine schrittweise Migration, Modul für Modul.
Um die neue Architektur in einem React Native 0.76+ Projekt zu aktivieren, setzen Sie das Flag newArchEnabled in der Datei react-native.config.js auf true. Danach arbeiten alle vorhandenen nativen Module weiter über Bridge, und neue Module können als Turbo Module erstellt werden. Codegen verarbeitet automatisch beide Optionen.
// react-native.config.js — neue Architektur aktivieren
module.exports = {
project: {
ios: {},
android: {},
},
assets: [],
newArchEnabled: true,
};
Es wird empfohlen, die Migration mit Modulen zu beginnen, die am häufigsten aus JavaScript aufgerufen werden — sie erhalten den größten Leistungsschub. Module, die selten aufgerufen werden (einmal pro Sitzung), können ohne wesentlichen Leistungsverlust auf Bridge belassen werden.
Häufig gestellte Fragen
Nein, Turbo Module erfordert React Native 0.73+ mit aktivierter neuer Architektur. Ab Version 0.76 wurde die neue Architektur stabil und für Produktionsprojekte empfohlen.
Ja, Turbo Module unterstützt beide Plattformen. JSI ist eine plattformübergreifende C++ Schicht und Codegen generiert Objective-C- und Java-Stubs für iOS bzw. Android.
Nein, Turbo Module funktioniert mit jeder JS-Engine über JSI. Allerdings wird Hermes empfohlen, da es für die Arbeit mit JSI und der neuen React Native Architektur optimiert ist.
Das Debuggen von Turbo Module erfolgt über Xcode oder Android Studio wie bei normalem nativem Code. Zusätzlich steht Flipper zur Verfügung, um JSI-Aufrufe und die Modulleistung zu verfolgen.
Turbo Module hat praktisch keinen Einfluss auf die App-Größe. Der C++ JSI Code ist bereits Teil von React Native und der generierte Code ist minimal — nur Schnittstellen ohne Logik-Duplizierung.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch