Die Entwicklung mit React Native fühlt sich oft wie eine Blackbox an, in der JavaScript-Code auf magische Weise in native UI-Komponenten übersetzt wird. Während das Expo SDK die meiste Komplexität abstrahiert, müssen leitende Architekten die zugrunde liegenden Mechanismen verstehen, um Edge Cases zu bewältigen oder benutzerdefinierte native Module zu erstellen.

Die Entwicklung des Frameworks von einer Bridge-basierten Architektur hin zum modernen, JSI-gestützten Modell verändert die Herangehensweise an Performance und native Integration. Wer über das SDK hinausgeht, benötigt ein klares Verständnis davon, wie Metro, JSI und Codegen interagieren, um Typsicherheit und Performance zu gewährleisten.

Kurz gesagt

  • Die neue Architektur ersetzt die Legacy-Bridge durch JSI, was einen direkten Speicherzugriff und eine synchrone Kommunikation zwischen JavaScript und nativem Code ermöglicht.

  • Codegen erzwingt Typsicherheit zur Build-Zeit, indem native Schnittstellen aus TypeScript-Spezifikationen generiert werden, was Laufzeitfehler verhindert, die im alten System häufig auftraten.

  • Architekten sollten native Implementierungen nur dann priorisieren, wenn Expo SDK-Module spezifische Performance- oder Feature-Anforderungen nicht erfüllen können, um unnötigen Wartungsaufwand zu vermeiden.

Der Wechsel von Bridge zu JSI

Die Legacy-Architektur basierte auf einer Bridge, um JSON-Nachrichten zwischen JavaScript- und nativen Threads zu serialisieren und zu deserialisieren. Dieser asynchrone Flaschenhals verursachte häufig Performance-Probleme bei hochfrequenten Operationen wie komplexen Animationen oder der Gestensteuerung.

JSI (JavaScript Interface) fungiert als dünne C++-Bindungsschicht. Sie ermöglicht es der JavaScript-Engine, Referenzen auf native Objekte zu halten und Methoden direkt aufzurufen. Dies eliminiert den Serialisierungs-Overhead und ermöglicht eine nahezu native Performance bei datenintensiven Aufgaben.

Codegen und Sicherheit zur Build-Zeit

Codegen ist der Mechanismus, der sicherstellt, dass die Schnittstelle zwischen JavaScript und nativem Code konsistent bleibt. Im alten System verließen sich Entwickler auf eine informelle Vereinbarung bezüglich der Datentypen, was oft zu Laufzeitfehlern führte, wenn native Module unerwartete Eingaben erhielten.

Durch die Definition von Spezifikationen in TypeScript oder Flow generiert Codegen während des Build-Prozesses automatisch den erforderlichen C++-, Objective-C- und Java-Code. Diese Verlagerung der Fehlererkennung vom Gerät des Nutzers in die Entwicklungsumgebung reduziert technische Schulden bei benutzerdefinierten nativen Modulen erheblich.