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

Expo Modules API

L’API d’Expo pour écrire des modules et vues natifs en Swift et Kotlin avec un DSL commun, sans Objective-C ni boilerplate de bridge.

Définition

L’Expo Modules API est l’API fournie par expo-modules-core pour écrire des modules natifs et des vues natives en Swift sur iOS et en Kotlin sur Android, avec une définition de module identique sur les deux plateformes. Un module déclare son nom, ses fonctions synchrones ou asynchrones, ses événements et ses vues dans un DSL (Name, Function, AsyncFunction, Events, View), et expo-modules-core se charge de la conversion des types et de l’exposition à JavaScript via JSI. Elle remplace l’écriture d’un Native Module classique en Objective-C et Java avec ses macros et son boilerplate, et constitue une alternative aux Turbo Modules de React Native, avec une courbe d’apprentissage plus courte. Elle fonctionne sur la New Architecture, et reste compatible avec les apps encore sur l’ancienne. Depuis le SDK 58, une version 2.0 en bêta permet d’annoter une classe Swift ou Kotlin ordinaire au lieu du DSL. Vous la rencontrez dès que vous écrivez un module maison ou lisez le code d’un package du SDK Expo.

Dans une vraie app

Un module Expo se crée avec npx create-expo-module, ou en local dans le projet avec npx create-expo-module --local qui le place dans modules/. Il est décrit par un fichier expo-module.config.json à sa racine, qui liste les plateformes et les classes de module ; c’est ce fichier que l’autolinking d’Expo lit, indépendamment de l’autolinking de la CLI React Native. Le code iOS est en Swift (sous-classe de Module avec un bloc definition), le code Android en Kotlin, et le JavaScript charge le module avec requireNativeModule.

Le choix entre Expo Modules, Turbo Modules et Nitro se résume à ce que vous écrivez : du C++ partagé, choisissez Turbo Modules ; des appels très fréquents sensibles à la latence (traitement de frames, lecture synchrone intensive), Nitro ; un accès natif ordinaire avec peu de boilerplate, l’Expo Modules API. La doc Expo indique des performances comparables aux Turbo Modules, les deux passant par JSI, et les microbenchmarks Android publiés avec le SDK 58 placent même Expo Modules 2.0 devant un Turbo Module dans les douze cas mesurés. Le prix d’entrée est une dépendance au package expo, et quelques centaines de kilo-octets dans le binaire.

Expo Modules 2.0, en bêta sur iOS et Android dans le SDK 58 après une phase expérimentale des macros iOS au SDK 57, remplace le DSL par des annotations sur une classe Swift ou Kotlin ordinaire. Expo annonce des appels synchrones 2,5 à 5,6 fois plus rapides que le DSL sur iOS. Le contrat JavaScript ne change pas, ce qui permet de migrer module par module.

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.