Saltar al contenido principal

Hermes como motor predeterminado

· 5 min de lectura
Michael Leon
Michael Leon
Software Engineer @ Meta
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

En octubre pasado, anunciamos que comenzamos a trabajar para convertir a Hermes en el motor predeterminado para todas las aplicaciones de React Native.

Hermes ha aportado gran valor a React Native dentro de Meta, y creemos que la comunidad de código abierto también se beneficiará. Diseñado para dispositivos con recursos limitados, Hermes optimiza el inicio de la aplicación, el tamaño del binario y el consumo de memoria. Una diferencia clave frente a otros motores JavaScript es su capacidad para compilar código fuente a bytecode con anticipación. Este bytecode precompilado se incluye en el binario, evitando que el intérprete realice este paso costoso durante el arranque.

Desde ese anuncio, hemos trabajado intensamente para mejorar Hermes, y hoy nos complace compartir que React Native 0.70 incluirá Hermes como motor predeterminado. Esto significa que todos los nuevos proyectos iniciados con v0.70 tendrán Hermes activado por defecto. Con el lanzamiento previsto para julio, queremos colaborar estrechamente con la comunidad para garantizar una transición fluida que aporte valor a todos los usuarios. Este artículo detallará los cambios esperados, benchmarks de rendimiento, nuevas funcionalidades y más. No es necesario esperar a React Native 0.70 para usar Hermes: puedes seguir estas instrucciones para activarlo en tu aplicación existente.

Aunque Hermes estará activado por defecto en nuevos proyectos de React Native, continuaremos dando soporte a otros motores.

Pruebas de rendimiento

Medimos tres métricas clave para desarrolladores: TTI, tamaño del binario y consumo de memoria. Utilizamos la aplicación React Native Mattermost en dispositivos de gama alta de 2020 para Android e iOS.

  • TTI (tiempo hasta la interacción) es el lapso entre el lanzamiento de la app y el momento en que el usuario puede interactuar. Para esta prueba, lo definimos como el tiempo desde que se presiona el icono hasta que se renderiza la primera pantalla. Incluimos grabaciones del arranque de Mattermost.

  • El tamaño del binario se midió como APK en Android e IPA en iOS.

  • El consumo de memoria se recopiló usando Mattermost durante varios minutos, ejecutando las mismas acciones en ambos motores.

Datos de Android

Todas las pruebas de Android se realizaron en un Samsung Galaxy S20.

Android Benchmarking Data

Video del TTI

Android TTI Video

Datos de iOS

Todas las pruebas de iOS se realizaron en un iPhone 12 Pro.

iOS Benchmarking Data

Video del TTI

iOS TTI Video

Video del TTI ralentizado para apreciar mejor la diferencia en tiempo de arranque

iOS Slowed Down TTI Video

Integración React Native/Hermes

Solucionamos un problema recurrente que causaba incompatibilidades al lanzar nuevas versiones: React Native dependía de binarios precompilados de Hermes distribuidos vía CocoaPods y npm, lo que podía generar incompatibilidades de API o ABI. A partir de React Native 0.69, Hermes se compila junto con cada versión de React Native, garantizando compatibilidad total. Esta integración más estrecha permite iteraciones más rápidas para desarrollar funcionalidades o corregir errores, y nos da mayor confianza al implementar cambios importantes en Hermes. Más detalles sobre este cambio aquí.

Intl en iOS

Hemos completado la implementación para iOS de Intl, la API de Internacionalización de ECMAScript que proporciona amplias funcionalidades sensibles al idioma. Esta era una brecha prolongada que impedía que algunos desarrolladores usaran Hermes. La implementación para Android, realizada en colaboración con Microsoft, se incluyó en React Native 0.65. Con React Native 0.70, los desarrolladores tendrán soporte nativo en ambas plataformas.

Las implementaciones típicas de Intl requieren importar grandes tablas de búsqueda o datos como Unicode CLDR. Sin embargo, esto puede aumentar el tamaño hasta 6MB, por lo que para evitar inflar el tamaño binario de Hermes, implementamos Intl llamando a las API expuestas por el propio iOS. Esto nos permite aprovechar todos los datos de localización e internacionalización que ya incluye iOS.

Trabajo en curso

Mientras seguimos evolucionando Hermes, queremos compartir nuestras prioridades inmediatas: mejorar la experiencia del desarrollador y garantizar que nadie evite usar Hermes por falta de características del lenguaje JavaScript. Específicamente, estamos:

  • Habilitando que los desarrolladores ejecuten el sampling profiler directamente desde la UI de Chrome DevTools.

  • Añadiendo soporte para BigInt, una solicitud recurrente de la comunidad que podría impedir el uso de Hermes al no poder implementarse mediante polyfills.

  • Implementando soporte para WeakRef, lo que expondrá nuevos controles de gestión de memoria a los desarrolladores.

Conclusión

Que Hermes sea el motor predeterminado marca el inicio de un camino a largo plazo. Estamos trabajando en nuevas características que permitirán a la comunidad crear aplicaciones eficientes durante muchos años. También animamos a la comunidad a compartir en nuestro repositorio de GitHub cualquier error, pregunta, comentario o idea. Hemos creado una etiqueta hermes para publicaciones específicas sobre Hermes.