Bien, entonces en el lado de C++ JNI, implementamos este método nativo injectModuleIntoJSGlobal. Toma esta dirección de memoria del puntero de tiempo de ejecución como argumento, y luego lo reinterpret convierte. Luego crea un objeto que podemos usar para almacenar nuestro enlace. Y luego llamamos a una función que hemos generado llamada RealmJSIInit. Es mucho C++ generado que básicamente almacenará el enlace entre nuestra biblioteca C++ y JSI. Y finalmente, establecemos una propiedad en el global a la que podemos acceder desde JavaScript después.
En iOS, tenemos que hacerlo un poco más sucio en el sentido de que necesitamos acceder al campo de tiempo de ejecución del puente RCT CXX, que es una API privada, y declaramos esto con un simple puntero. Y más tarde, básicamente, de nuevo, declaramos una función sincrónica bloqueante que podemos llamar desde JavaScript. Obtenemos el puntero de tiempo de ejecución de JSI desde el puente, y luego lo convertimos, y luego creamos el sujeto de exportación. Nuevamente, llamamos a la función RealmJSIInit para poblarlo, y finalmente, lo almacenamos en el global para que podamos acceder a él desde JavaScript. Luego finalmente retornamos.
Bien, la última y más reciente alternativa que voy a presentar es NitroModules. Es el nuevo en el bloque introducido por Marcello y Mark Rosevie. Es muy rápido en benchmarks sintéticos. Soporta C++, Swift, Kotlin. Es mucho más expresivo en la parte de generación de código que las otras alternativas. Aprovecha el estado nativo de JSI y establece correctamente la presión de memoria externa. También soporta tanto la nueva como la antigua arquitectura desde hace unos días, a lo cual volveré. El único inconveniente que puedo ver ahora mismo al usar esto es que requiere que los desarrolladores de aplicaciones como tus usuarios de biblioteca instalen una dependencia de pares llamada React Native NitroModules, pero creo que esto es solucionable en el futuro.
Bien, así que mi conclusión es que, o al menos hasta hace unos días, sería usar el patrón de módulo TurboNative compatible hacia atrás. Esta es la forma oficial bendecida de hacer las cosas, pero NitroModules cambió y ya no solo soporta la nueva arquitectura. Así que diría que uses NitroModules si te sientes aventurero, pero entonces ¿a quién estoy engañando? Estás usando React Native, así que por supuesto te sientes aventurero. Así que básicamente, el último consejo antes de irme, pre-construir es una forma de tomar una parte de tu código nativo y construirlo en tu máquina en lugar de en la máquina del usuario final. El beneficio de esto es reducir el tiempo de construcción en las máquinas de tus usuarios de biblioteca y también la complejidad en sus cadenas de construcción. Otro beneficio es que obtienes fallos de tipo en tu tiempo de desarrollo en lugar de hacerlo en las máquinas de los desarrolladores, como las máquinas de tus usuarios. Una limitación de Xcode y CocoaPods es que no pueden manejar un proyecto CMake. Y esta es una forma de solucionar eso, básicamente usar CMake para generar un proyecto Xcode que básicamente pueda pre-construir un marco XE, por ejemplo. Eso es lo que estamos haciendo en Realm. Luego, una limitación aquí en el lado de Android es que estos están en decay, como todos estos pre-construidos son específicos de ABI en decay, lo que significa que tienes que enviar múltiples pre-construidos, uno por en decay, pero generalmente no es un problema muy grande porque las versiones en decay no cambian tan a menudo. O eso, necesitas entonces, si no envías múltiples, entonces necesitas declarar, supongo, con qué versión en decay es compatible tu biblioteca.
Comments