¿React Native es estable?

Esta respuesta es de mi publicación original ” ¿React Native es una buena opción para el desarrollo de aplicaciones móviles a largo plazo?

Durante el último año, React Native ha ido ganando popularidad entre los desarrolladores de aplicaciones móviles. También hay un aumento muy constante en el número de aplicaciones de producción y de código abierto escritas usando React Native. Facebook, el mantenedor de React Native, ha hecho que sea relativamente fácil para los desarrolladores aprender y adoptar React Native al adoptar el lenguaje JavaScript demasiado familiar. Los desarrolladores que ya tienen experiencia con Javascript encontrarán que React Native es una excelente opción. El desarrollador de PhoneGap encontrará que aprender y adelantarse a la curva de aprendizaje es relativamente fácil. ¿Pero es React Native una buena opción para una aplicación estable a largo plazo?

Limitaciones y desventajas de React Native

En este artículo, intentaré mencionar la limitación y las áreas grises que actualmente tiene React Native. La mayoría de estas deficiencias están siendo abordadas por Facebook y la comunidad React Native. Pero hay algunas preocupaciones que podrían evitar que saltes de un barco al desarrollo de la aplicación móvil React Native. Siempre es bueno saber estas preocupaciones con suficiente antelación.

  • El desarrollo de aplicaciones nativas tiene sus ventajas
    Sabemos que Javascript es rápido, pero Java, ObjC y Swift son más rápidos, especialmente para cálculos pesados. Es un hecho conocido que el código JavaScript no es tan eficiente para las tareas de cálculo intensivo, y hay una sobrecarga cuando JavaScript controla elementos nativos. JavaScript tiene un único subproceso de dispositivo dedicado, mientras que el código nativo es libre de usar los subprocesos que desee. En rendimiento, React Native se queda atrás de una aplicación nativa optimizada.

    Si su aplicación no está haciendo mucho trabajo pesado (es decir, en términos de uso intensivo de memoria o CPU), React Native parece una muy buena opción. Después de haber trabajado con plataformas híbridas y nativas antes, si su aplicación está haciendo un montón de trabajo pesado, aún recomendaría el desarrollo nativo como una forma de administrar más de cerca cosas como el uso de CPU y la huella de memoria.

  • Actualizaciones constantes de la plataforma.
    React Native es una plataforma relativamente joven y emergente. Mientras que el desarrollo nativo es bastante maduro. iOS (ObjC) y Android (Java) han estado en movimiento durante casi 10 años y hay algunas herramientas realmente excelentes que se han desarrollado en ese momento. Esto no es realmente una desventaja, sino más bien otro punto que React Native tiene mucho que ponerse al día. Debido a su entrada relativamente nueva, React Native está en pleno desarrollo, y se lanza una nueva versión cada mes. Las actualizaciones constantes traen nuevos componentes nativos portados, personalizados mejorados (como el Navegador), correcciones de errores y mejoras de rendimiento. Esto es bueno en términos de actividad de la plataforma. Pero es una mala elección si la aplicación se va a mantener a largo plazo, ya que cada compilación puede requerir la actualización de la plataforma, lo que conlleva una verificación de dependencia para la base de código existente. La incorporación de estas nuevas versiones requiere actualizaciones vigilantes de nuestro propio código si cambia la lógica de los componentes preconstruidos. Por lo tanto, los desarrolladores tendrán que hacer un esfuerzo para incorporar estos cambios a fin de mantenerse al día con la plataforma. Muchas personas toman React Native entendiendo completamente esta situación. Pero si está consultando a un cliente, asegúrese de que comprenda este hecho.
  • Lenguaje vagamente escrito
    React Native utiliza código JavaScript, hojas de estilo CSS y etiquetas HTML para el diseño. El lado bueno es que podemos usar todos los mejores aspectos de JavaScript, pero por supuesto, el lado malo es que trae algunos de los horrores de Javascript. A diferencia de Java y Swift, Javascript no aplica un tipo de variables y parámetros a las funciones. Es decir, cualquier variable puede ser cualquier cosa en cualquier momento. Los desarrolladores deben seguir la disciplina y los estándares que practican en su lenguaje de programación nativo fuertemente tipado
  • Dependencia del idioma nativo
    Si una funcionalidad que necesita no está disponible actualmente en React Native, terminaremos escribiendo módulos nativos. Los módulos nativos son una forma de puentear el código nativo y el código React Native. El módulo nativo debe estar escrito en Java y rápido / objetivo c. Posiblemente, en algún momento durante su desarrollo, tenga que pedir ayuda a un desarrollador nativo o hacerlo usted mismo en el idioma nativo.
  • Limitaciones de las capas de abstracción
    React Native es una abstracción, lo que significa que hay una gran cantidad de código entre el desarrollador y la plataforma nativa para la que está desarrollando. Un problema importante con las abstracciones son los errores. Si encuentra un problema con la capa de abstracción, es posible que deba profundizar en la implementación y solucionarlo usted mismo. ¡Esto puede llevar mucho tiempo y puede encontrar problemas que no puede resolver! Otro problema con las capas de abstracción es que usted depende de un tercero no solo para la corrección de errores, sino también para mantener su marco actualizado. El mundo de iOS se mueve muy rápido, y otras compañías como Xamarin tienen que trabajar muy duro para mantener actualizada su capa de abstracción. Otra fuga de abstracción menos obvia son las funciones a las que no puede acceder. La mayoría de las capas de abstracción están incompletas porque hay algunas características del sistema subyacente que no están expuestas a través de la capa de abstracción.
  • Compromiso a largo plazo y compatibilidad con la próxima versión del sistema operativo
    Una preocupación importante con el uso de React Native es la falta de compromiso a largo plazo con el proyecto. React Native no es un plug-and-play como CocoaPod, no es un simple SDK, no es una mera biblioteca, es una plataforma completa de desarrollo de software. Si Facebook deja de mantener React Native, mi aplicación se estancará y no habrá un “Reemplazo de React Native” a nuestra disposición. Hemos visto que esto sucede con Facebook con Parse.

    La adaptación a las nuevas versiones del sistema operativo será lenta. En otras palabras, actualmente no tiene ninguna garantía de que alguna vez sea compatible con iOS 11 o 12.

  • Licencia y controversia de patentes
    Por último, pero una de las preocupaciones más importantes con React Native es su controversia sobre licencias y patentes. Junto con su licencia permisiva de estilo BSD, React Native se entrega con la concesión adicional de derechos de patente de Facebook, versión 2. La semana pasada, Facebook actualizó su licencia de código abierto y patente para React, ReactNative y otros proyectos de código abierto. Según la actualización, su derecho a usar los proyectos de código abierto de Facebook se rescindirá si demanda a Facebook por un problema de patente. En la práctica, esto parece un impedimento para usar Facebook sobre las patentes. Por implicación, también parece darle a Facebook un buen respiro para infringir patentes dentro de la aplicación que usa React Native. Este cambio en particular ha creado mucho pánico en torno a los desarrolladores que usan React, React Native y otros proyectos de código abierto. Este cambio dio como resultado que Automattic, el creador de WordPress, abandonara por completo su reescritura de código de WordPress en React (no React Native). ¡Eso fue un trabajo de años! La Fundación Apache había anunciado anteriormente que ya no usarán el código de licencia BSD + Patents de Facebook para nuevos proyectos. Estos incidentes suenan pesimistas. Pero debe ser pesimista al evaluar las licencias y patentes de software.

    Recientemente Facebook volvió a licenciar sus proyectos de código abierto React, Jest, Flow e Immutable.js bajo la licencia MIT y eliminando la licencia de estilo BSD + Patents. Este es un movimiento muy positivo de Facebook, ya que han reconocido las preocupaciones de la comunidad de código abierto. Espero que usen lo mismo para la licencia MIT para React Native, que todavía está bajo la licencia de estilo BSD + Patents.

Puede sentir que algunas de las limitaciones mencionadas aquí también son válidas para plataformas híbridas o incluso nativas. La intención de este artículo es hacerte consciente de la limitación de la plataforma antes de dar el salto al desarrollo nativo reactivo. Con la atención actual que React Native está reuniendo en la comunidad actual de desarrollo de aplicaciones móviles, estoy seguro de que en el futuro, React Native podría superar a PhoneGap y Xamarin.

Todavía no realmente. Si solo está creando un cliente móvil para un sitio web, probablemente estaría bien. Si intentas conectarte a algo nativo, no es estable. Un ejemplo de esto es usar el teclado nativo. No existe un mecanismo para mover las entradas de manera consistente y precisa por encima del teclado nativo. Los ganchos disponibles para hacerlo usted mismo son piratería y se basan en estimar las alturas de los objetos de la interfaz de usuario, y a veces se combinan con el intento del sistema de mover las entradas por encima del teclado (por lo que debe desplazarse dos veces). Además, no puede esperar que su compilación se ejecute en versiones del sistema operativo que no haya probado. Por ejemplo, la versión de lanzamiento de nuestra aplicación que usa RN solo se ejecuta en iOS 10.3. Se bloqueará en 10.2 y anteriores. El bloqueo está en el código de inicialización de la RN.

¡Absolutamente no!

Recientemente lancé mi aplicación usando react native y se bloquea en varios dispositivos, pero no en todos. Sé cuál era el problema, pero aún así es inaceptable trabajar solo en algunos dispositivos. La versión de react native es <1.x, así que resume lo que dije anteriormente.