Aller au contenu
useffect.sh
Planifier 30 min avec un senior
Architecture

Turbo Modules

Les modules natifs de la New Architecture : une spec TypeScript, du code généré par Codegen, et un chargement à la demande via JSI.

Définition

Les Turbo Modules sont le système de modules natifs de la New Architecture de React Native. Un Turbo Module se compose d’une spec typée (TypeScript ou Flow) qui décrit les méthodes exposées à JavaScript, du code natif qui les implémente (Kotlin ou Java sur Android, Objective-C++ ou Swift sur iOS, ou C++ partagé), et des interfaces générées par Codegen à partir de la spec. Côté JavaScript, on récupère le module avec TurboModuleRegistry.get ou getEnforcing. Ils remplacent les Native Modules historiques, qui étaient tous instanciés au démarrage et dont chaque appel passait par le bridge en JSON sérialisé. Avec JSI, un Turbo Module est chargé à la première utilisation et ses méthodes peuvent être appelées de façon synchrone. Écrire un accès natif maison sans Expo Modules ni Nitro, par exemple pour lire un capteur matériel ou appeler le SDK de paiement d’un prestataire, c’est écrire un Turbo Module.

Dans une vraie app

Dans un projet, un Turbo Module se repère à la clé codegenConfig de son package.json (avec type: "modules" et un jsSrcsDir) et à un fichier de spec dont le nom commence par Native, par exemple specs/NativeLocalStorage.ts. Côté iOS la classe est en .mm et adopte le protocole généré ; côté Android elle étend la classe abstraite générée et est enregistrée dans un BaseReactPackage. Codegen tourne à chaque build (tâche Gradle sur Android, phase de script au pod install sur iOS), donc une spec qui ne compile pas casse le build natif, pas l’app au runtime.

Le piège le plus courant : utiliser getEnforcing dans une librairie optionnelle. Si le module natif n’est pas linké (mauvais autolinking, monorepo mal configuré), l’app crashe au premier import avec un message peu parlant. get renvoie null et laisse le choix d’un fallback. Autre point, les types : une méthode qui renvoie Promise<Object> en spec devient un NSDictionary ou une WritableMap côté natif ; les types riches ne traversent pas tels quels.

Pour un nouveau module aujourd’hui, le choix se fait entre un Turbo Module « pur » (utile si vous avez du C++ à partager), l’Expo Modules API (DSL Swift/Kotlin, moins de boilerplate) et Nitro Modules (Swift/Kotlin natifs via JSI, le plus rapide sur les appels fréquents). Les trois reposent sur JSI ; la doc React Native recommande les Turbo Modules si vous comptez écrire du C++.

Nos offres sur ce sujet

Sources

Les 35 termes du glossaire

Un de ces sujets bloque votre app ?

30 minutes avec un senior pour regarder le problème dans votre code. Gratuit.