Lo bueno y lo malo del desarrollo de aplicaciones web con Node.js

author
20 minutes, 58 seconds Read
CONTENIDO

Tiempo de lectura: 13 minutos

Siendo el lenguaje de programación más popular, JavaScript es también una de las tecnologías de desarrollo de software más universales. Utilizado tradicionalmente como herramienta de desarrollo de frontales web, también se ha convertido en una importante herramienta de desarrollo móvil multiplataforma como tecnología básica para un gran número de plataformas, como Apache Cordova/PhoneGap, React Native, NativeScript, Appcelerator Titanium.

Pero los ámbitos de aplicación de JavaScript no terminan aquí. Últimamente, se ha producido un gran revuelo en torno al uso de JavaScript para la programación del lado del servidor. Una de las herramientas que indicó este cambio en el desarrollo web fue Node.js.

¿Qué es Node.js?

Node.js no es en realidad un framework o una librería, sino un entorno de ejecución, basado en el motor JavaScript V8 de Chrome.

La tecnología fue presentada por primera vez en 2009 por Ryan Dahl en la conferencia europea anual JSConf y fue reconocida inmediatamente como «la pieza de software más emocionante del universo JavaScript actual».

Como proyecto de código abierto, Node.js fue patrocinado por Joyent, un proveedor de soluciones de computación en la nube y de alojamiento. La empresa invirtió en otras tecnologías, como el framework Ruby on Rails, y proporcionó servicios de alojamiento a Twitter y LinkedIn. Esta última también se convirtió en una de las primeras empresas en utilizar Node.js para el backend de sus aplicaciones móviles. Posteriormente, la tecnología fue adoptada por varios líderes tecnológicos, como Uber, eBay, Walmart y Netflix, por nombrar algunos.

Sin embargo, no fue hasta hace poco que comenzó la adopción generalizada de JavaScript del lado del servidor con Node.js. El interés por esta tecnología alcanzó su punto máximo en 2017, según Google Trends, y sigue siendo alto.

Descargas de Node.js. Instala el soporte a largo plazo y las últimas versiones de Node.js para Windows y MacOS aquí. También, un recordatorio – npm se distribuye con Node.js out-of-the-box.

Documentación. Encuentra la documentación y las guías de inicio en el enlace.

Node.js IDEs . Casi cualquier editor de código popular tiene soporte y plugins para JavaScript y Node.js, por lo que sólo importa cómo personalizar su IDE a sus necesidades de codificación. Pero, muchos desarrolladores alaban mucho las herramientas especiales de VS Code, Brackets, Atom y WebStorm.

Frameworks. Usar middleware sobre Node.js puro es una práctica común que facilita la vida de los desarrolladores. Tenemos un artículo aparte en el que se comparan los frameworks más populares de Node.js, en el que analizamos Express.js, Meteor, Sales.js, Koa.js, Keystone.js y Loopback.js.

Para conocer más herramientas del ecosistema JavaScript utilizadas con Node.js, consulte el artículo dedicado.

Los puntos fuertes y débiles de Node.js hacen que sea objeto de una acalorada discusión. Para dejar las cosas claras, hemos analizado ambos -los pros y los contras de Node.js- en un intento de averiguar qué proyectos pueden beneficiarse de esta elección tecnológica. Entonces, ¿por qué usar Node.js?

Una rápida explicación de lo que es Node.js (por favor, suscríbete si quieres más contenido en vídeo)

Los beneficios de Node.js

⊕ Pila tecnológica robusta

JavaScript ha demostrado ser un líder indiscutible entre los lenguajes de programación más populares. A su vez, Node.js se ha convertido en un nombre independiente en la industria. Con un total de 368.985.988 descargas y más de 750 nuevos contribuyentes, como se indica en el informe Node-by-numbers 2018, el proyecto parece estar más fuerte que nunca.

Usando Node.js para el backend, obtienes automáticamente todos los pros del desarrollo de JavaScript de pila completa, tales como:

  • mayor eficiencia y productividad general de los desarrolladores
  • compartición y reutilización de código
  • velocidad y rendimiento
  • fácil intercambio de conocimientos dentro de un equipo
  • una enorme cantidad de herramientas gratuitas

Consecuentemente, tu equipo es mucho más flexible, el desarrollo consume menos tiempo y, como resultado, obtienes un software rápido y fiable. Los desarrolladores formados en JavaScript frontend pueden empezar a programar el lado del servidor con el mínimo esfuerzo. Con el mismo lenguaje en ambos lados, se puede reutilizar el código en el frontend y en el backend envolviéndolo en módulos y creando nuevos niveles de abstracción.

A pesar de una creencia común, siendo un desarrollador de pila completa no estás de ninguna manera limitado a la pila tradicional MEAN (MongoDB, Express.js, AngularJS y Node.js). Lo único imprescindible en este caso es Node.js (no hay alternativa en JavaScript para la programación del backend). El resto de las tecnologías dentro de esta pila son opcionales y pueden ser sustituidas por algunas otras herramientas que proporcionan una funcionalidad similar (lee sobre las alternativas en nuestro artículo separado).

⊕ Procesamiento rápido y modelo basado en eventos

Node.js es rápido; no es un mito. Echa un vistazo a las pruebas de rendimiento de toptal.com, comparando cómo GO, PHP, Java y Node.js manejan las peticiones concurrentes. Hay un par de razones para que Node.js muestre tales resultados:

Motor V8. El motor utilizado en la implementación de Node.js fue desarrollado originalmente para el navegador Chrome. Escrito en C++, el V8 de Chrome se utiliza para compilar funciones escritas en JavaScript en código máquina, y hace el trabajo a una velocidad impresionante. No hay más que ver las pruebas de rendimiento en el blog de V8. Gracias a que Google invierte fuertemente en su motor, V8 demuestra mejoras de rendimiento cada año, y Node.js extrae toda la bolsa de beneficios de él.

El manejo de entradas/salidas sin bloqueo y de peticiones asíncronas hizo que Node.js fuera capaz de procesar peticiones sin ningún retraso. En el contexto del backend, el procesamiento síncrono supone que el código se ejecuta en una secuencia. Por lo tanto, cada petición bloquea un hilo, haciendo que otras peticiones esperen a que termine. El procesamiento asíncrono permite procesar las peticiones sin bloquear (I/O sin bloqueo) el hilo. Así que después de procesar una petición, puede enviar una llamada de retorno y continuar sirviendo peticiones. Esto ayuda a Node.js a sacar el máximo provecho de un solo hilo, lo que resulta en un corto tiempo de respuesta y el procesamiento concurrente.

Otro aspecto es el modelo basado en eventos. Cuando se utiliza un lenguaje común para el lado del cliente/servidor, la sincronización se produce rápidamente, lo que es especialmente útil para las aplicaciones basadas en eventos y en tiempo real. Debido a su naturaleza asíncrona, no bloqueante y de un solo hilo, Node.js es una opción popular para los juegos en línea, los chats, las videoconferencias o cualquier solución que requiera datos constantemente actualizados.

Los ejemplos hablan por sí solos: muchas empresas líderes cambiaron de tecnología para desarrollar aplicaciones Node.js y notaron mejoras significativas – PayPal, por ejemplo, notó una disminución del 35 por ciento en el tiempo de respuesta desde que migró de Java.

⊕ Tecnología escalable para microservicios

Dado que es una herramienta tecnológica ligera, usar Node.js para la arquitectura de microservicios es una gran elección. Este estilo arquitectónico es mejor descrito por Martin Fowler y James Lewis como «un enfoque para desarrollar una única aplicación como un conjunto de pequeños servicios, cada uno de los cuales se ejecuta en su propio proceso y se comunica con mecanismos ligeros, a menudo una API de recursos HTTP».

De acuerdo con esto, al dividir la lógica de la aplicación en módulos más pequeños, microservicios, en lugar de crear un único y gran núcleo monolítico, se permite una mejor flexibilidad y se sientan las bases para un mayor crecimiento. Como resultado, es mucho más fácil añadir más microservicios sobre los existentes que integrar características adicionales con la funcionalidad básica de la app.

Arquitectura monolítica frente a arquitectura de microservicios en pocas palabras

Node.js es la tecnología elegida a la hora de construir y desplegar soluciones del ecosistema de microservicios, según el Informe de la Encuesta de Usuarios de Node.js de 2017. Aproximadamente la mitad de los encuestados utilizan tecnologías relacionadas con los microservicios (en concreto, Docker, la principal plataforma de contenedorización de software) para construir aplicaciones web Node.js:

Porcentaje de desarrolladores que utilizan la contenedorización Docker con Node.js

Los hallazgos más recientes muestran que las tecnologías relacionadas con los microservicios, como Docker y Kubernetes, experimentaron un crecimiento en su uso en 2018, a medida que este estilo arquitectónico se vuelve solo más popular. Con cada microservicio comunicándose con la base de datos directamente a través de flujos, dicha arquitectura permite un mejor rendimiento y velocidad de la aplicación. Un partido hecho en el cielo es apoyado por dos marcos ampliamente utilizados para la arquitectura de microservicios. El marco Express cuenta con IBM y Uber entre sus usuarios, mientras que restify es utilizado por npm y Netflix.

Como ejemplo de implementación en vivo, el cambio de Walmart a la arquitectura de microservicios con Node.js se tradujo en los siguientes beneficios inmediatos:

  • Un crecimiento nocturno del 20 por ciento de las conversiones en general y del 98 por ciento de las conversiones móviles
  • Un tiempo de actividad del cien por cien en el Black Friday (gestionando más de 500 millones de páginas vistas)
  • Ahorro de hasta un 40 por ciento en hardware y de un 20 a un 50 por ciento en operaciones generales

Otro brillante ejemplo de cómo Node.js puede superar a la competencia en términos de rendimiento es el caso de GoDaddy. Al ejecutar la campaña publicitaria de la SuperBowl, la empresa fue capaz de manejar 10.000 peticiones por segundo sin tiempo de inactividad, utilizando sólo el 10 por ciento del hardware gracias a Node.js.

⊕ Rico ecosistema

Una palabra – npm, un gestor de paquetes de Node.js por defecto, también sirve como un mercado para las herramientas de JavaScript de código abierto, que juega un papel importante en el avance de esta tecnología. Con unas 836.000 bibliotecas disponibles en el registro de npm hasta ahora, y más de 10.000 nuevas publicadas cada semana, el ecosistema de Node.js es bastante rico. Las mismas estadísticas señalan que el 97 por ciento de las aplicaciones web modernas están formadas por módulos npm. Y eso es una prueba de su indiscutible popularidad entre los desarrolladores.

Con tal variedad de herramientas gratuitas accesibles en unos pocos clics, hay un enorme potencial para el uso de Node.js. Al mismo tiempo, el software de código abierto goza de una creciente popularidad, ya que permite construir nuevas soluciones reduciendo los costes generales de desarrollo y el tiempo de comercialización.

⊕ Fuerte apoyo corporativo

Como se ha mencionado anteriormente, el desarrollo de Node.js fue apoyado por Joyent. En 2015, se creó la Fundación Node.js para «permitir la adopción generalizada y ayudar a acelerar el desarrollo de Node.js.» IBM, Microsoft, PayPal, Fidelity y SAP se convirtieron en los miembros fundadores de la organización.

La lista de organizaciones que utilizan Node.js en producción no deja de crecer. Actualmente incluye a casi trescientas empresas de renombre, como PayPal, Medium, Trello, Uber y Zendesk.

Muy pocos proyectos de código abierto han gozado de un apoyo tan fuerte por parte de las principales empresas del mundo. Y eso augura que Node.js tiene un potencial extraordinario.

⊕ Soporte JSON sin fisuras

Aunque otras tecnologías de backend como PHP y Ruby on Rails pueden utilizar el formato JSON para la comunicación, Node.js lo hace sin convertir entre modelos binarios y utiliza JavaScript. Esto es especialmente útil cuando se necesita construir APIs RESTful para el soporte de bases de datos NoSQL, como MongoDB – la letra M en la pila MEAN. Esta comunicación fluida con uno de los principales estándares de transferencia de datos es otra de las ventajas del ecosistema JavaScript.

Los inconvenientes de Node.js

Θ Cuellos de botella en el rendimiento con tareas de cálculo pesadas

El mayor inconveniente de Node.js incluso ahora es su incapacidad para procesar tareas ligadas a la CPU. Pero, para entender cuáles son las raíces de este problema, necesitamos un poco de contexto. Empecemos por lo básico, con el propio JavaScript.

Como sabemos, Node.js es un entorno de ejecución que ejecuta JavaScript en el lado del servidor. Al ser un lenguaje de programación frontend, JavaScript utiliza un único hilo para procesar las tareas rápidamente. No es necesario el uso de hilos para que funcione, ya que las tareas en JavaScript son ligeras y requieren poca CPU.

Volviendo a Node.js, ahora sabemos por qué se considera de un solo hilo: Procesa JavaScript, que es de un solo hilo. Un modelo de entrada/salida no bloqueante significa que Node.js responde a la llamada del cliente para iniciar una petición y procesa la tarea durante el tiempo que dispara el callback, ya que la tarea está lista. Al procesar las tareas de forma asíncrona, Node ejecuta el código JS en su único hilo en función de los eventos. Esto es lo que se llama un bucle de eventos.

El problema se produce cuando Node.js recibe una tarea ligada a la CPU: Cada vez que llega una petición pesada al bucle de eventos, Node.js pondría toda la CPU disponible para procesarla primero, y luego respondería a otras peticiones en cola. Eso resulta en un procesamiento lento y un retraso general en el bucle de eventos, por lo que Node.js no se recomienda para la computación pesada.

Sin embargo, en 2018, el multithreading se introdujo en Node.js como una característica experimental con la actualización 10.5.0. Una nueva característica llamada módulo de hilos de trabajo se puede utilizar para aprovechar los hilos adicionales de un grupo de hilos, para llevar las tareas vinculadas a la CPU. Pero eso sólo puede hacerse en máquinas con múltiples núcleos, ya que Node.js todavía permite utilizar un núcleo para un hilo. Eso significa que los procesos paralelos pesados pueden ser ejecutados en un hilo diferente. Esta característica sigue siendo experimental en la versión 12 de Node.js pero ha sido mejorada significativamente.

Θ Callback hell issue

Debido a su naturaleza asíncrona, Node.js depende en gran medida de los callbacks, las funciones que se ejecutan después de que cada tarea en la cola haya terminado. Mantener un número de tareas en cola en segundo plano, cada una con su callback, puede resultar en el llamado infierno de callbacks, que impacta directamente en la calidad del código. En pocas palabras, es una «situación en la que las devoluciones de llamada se anidan dentro de otras devoluciones de llamada a varios niveles de profundidad, lo que potencialmente dificulta la comprensión y el mantenimiento del código»

Ejemplo de código con devoluciones de llamada anidadas

Fuente de la imagen: callbackhell.com

Sin embargo, esto se considera a menudo un signo de los pobres estándares de codificación y la falta de experiencia con JavaScript y Node.js en particular. El código, representado arriba, puede ser refactorizado y simplificado, en sólo unos pocos pasos, como se muestra en callbackhell.com.

Θ Inmadurez de las herramientas

Aunque los módulos centrales de Node.js son bastante estables y pueden considerarse maduros, hay muchas herramientas en el registro npm que son de mala calidad o no están debidamente documentadas/probadas. Además, el propio registro no está lo suficientemente bien estructurado como para ofrecer las herramientas en función de su calificación o calidad. Por lo tanto, podría ser difícil encontrar la mejor solución para sus propósitos sin saber qué buscar.

El hecho de que el registro Node.js es mayoritariamente de código abierto, también tiene su impacto. Mientras que la calidad del núcleo de la tecnología Node.js está supervisada por Joyent y otros contribuyentes importantes, el resto de las herramientas podría carecer de la calidad y los altos estándares de codificación establecidos por las organizaciones globales.

Θ Creciente demanda de profesionales con experiencia

A pesar de una creencia común, no todos los desarrolladores de JavaScript son también desarrolladores de Node.js. Dominar la programación de JavaScript del lado del servidor requiere una cantidad significativa de esfuerzo y una cierta experiencia en el desarrollo de backend. Debido a una curva de aprendizaje tan pronunciada, el número de ingenieros de Node.js es significativamente menor que el número total de profesionales de JS.

A medida que el bombo de Node.js sigue creciendo, la demanda de profesionales con experiencia en este campo aumenta.

Hay una gran brecha de conocimientos entre los estudiantes de ingeniería que empiezan en sus trabajos y las necesidades de los empleadores
Fuente: HackerRank

Por lo tanto, con millones de desarrolladores de JavaScript por ahí, podría ser difícil encontrar un profesional capacitado en Node.js para su proyecto. En este caso, seguramente no querrá limitar su búsqueda a un solo país. La búsqueda de talento técnico en el extranjero se ha convertido desde hace tiempo en la norma en la industria de las TI.

Cómo aprender Node.js

Aquí tienes tu pack de inicio para entender y trabajar con Node.js.

Turoriales. No te limites a los docs oficiales: Consulta toneladas de lecciones gratuitas en W3Schools, visita los talleres internacionales de Nodeschool y, por supuesto, utiliza la biblioteca de tutoriales gratuitos de freeCodeCamp.

Clases. Si eres un estudiante dedicado, empieza un curso online sobre Node.js: Aquí hay uno en PluralSight, y por supuesto, uno en Udemy.

Aprendizaje interactivo. Consulta los recursos gratuitos y de pago que te permiten aprender Node.js mediante lecciones y ejercicios interactivos. Uno de los más populares es The Art of Node.

Comunidad. Consulta la lista oficial de proyectos de Node.js gestionados por la comunidad. Un consejo rápido: Investiga los grupos y comunidades de Facebook de tu zona/primer idioma. Y por supuesto, consulta las comunidades de Node.js en Reddit, una etiqueta en StackOverflow y el tema en Quora.

Node.js vs Ruby on Rails vs Django vs Symfony

No hay muchas tecnologías que puedan competir con la popularidad de Node.js o la demanda del mercado. Sin embargo, si miramos las alternativas para la programación del lado del servidor, vemos al menos tres estrellas más que brillan en el cielo. Se trata de Ruby on Rails, Django y Symfony. Veamos si están a la altura de las ventajas de Node.js y si comparten sus inconvenientes.

Comparación de las estadísticas de Node.js, Rails, Django y Symfony

Fuente: StackShare

Ruby on Rails es conocido por su lenguaje sencillo pero opinable y la disponibilidad de gemas – el ecosistema propio de Rails de paquetes personalizados. Ruby en sí mismo es un lenguaje intuitivo y amigable para los principiantes con una comunidad solidaria y dedicada que contribuye con código a RubyGems. Rails se creó para el desarrollo rápido y la creación de prototipos, aunque es utilizado con éxito por marcas como GitHub, Twitter y Airbnb, lo que demuestra su amplia gama de casos de uso. Su funcionalidad de migración de datos es especialmente impresionante: a diferencia de Node.js, que utiliza paquetes adicionales, Rails ya cuenta con una función que permite manipular la base de datos de forma fácil y consistente.

¿Cuándo debería utilizar Rails en lugar de Node.js? Rails no puede competir con el rendimiento y la escalabilidad de Node, sin embargo, Rails puede ser una mejor opción para el desarrollo rápido. Node.js tiene que utilizar módulos de terceros para conseguir esa velocidad de desarrollo, pero Ruby lo tiene todo de forma no convencional. En cuanto al lenguaje, ninguna herramienta tiene una ventaja clara – mientras que Node.js tiene una alta demanda pero una baja propuesta, la reserva de talento de Ruby es inicialmente menor.

Django es un framework web sobre Python, el lenguaje de programación de más rápido crecimiento según los datos de StackOverflow. Comercializado como una herramienta para perfeccionistas con plazos, está creado para hacer aplicaciones lo más rápido posible y de la forma más estructurada, segura y fácil de entender. Django, junto con Python, también se considera que tiene una curva de aprendizaje más suave. Mientras que para trabajar con Node.js es necesario tener amplios conocimientos de JavaScript, Django es una tecnología «con pilas incluidas». Tiene un panel de administración incorporado para actualizar y mantener fácilmente sus bases de datos y plantillas para acelerar su trabajo.

¿Cuándo debería usar Django sobre Node.js? En comparación con Node.js, Django es una herramienta para principiantes. Aparte del lenguaje en sí, no hay ninguna razón real para elegir uno sobre el otro. Es más una cuestión de su comodidad y experiencia con JavaScript o Python que de los casos de uso específicos.

Symfony es un framework PHP que automáticamente le proporciona más de 20 años de documentación, y una comunidad masiva y activa. Más del 80 por ciento de la web se alimenta de PHP con proyectos como Facebook, Baidu, o cualquier otro sitio web que se ejecuta en WordPress. Aunque Symfony es sólo uno de los frameworks de PHP en el mercado, es impresionantemente estable, escalable y funciona bien para proyectos a gran escala. También utiliza un motor de plantillas Twig que funciona de forma similar a muchos sistemas de gestión de contenidos basados en PHP.

¿Cuándo deberías usar Symfony en lugar de Node.js? Symfony es naturalmente compatible con las características de los CMS, como las plantillas y los paneles de administración, lo que le permite ejecutar blogs, sitios de noticias y tiendas de comercio electrónico. Algunos de los ejemplos incluyen Yahoo Answers, Dailymotion, y National Geographic.

Haz que Node.js brille

Obviamente, con todas las ventajas y desventajas enumeradas de Node.js, la tecnología no es una bala de plata. Pero tampoco lo es Java, .Net framework o PHP. Sin embargo, hay casos específicos en los que cada una de las tecnologías enumeradas funciona mejor. En el caso de Node.js, se trata de aplicaciones en tiempo real con una intensa E/S, que requieren velocidad y escalabilidad.

Puede tratarse de redes sociales, aplicaciones de juegos, chats en directo o foros, así como de software bursátil o servidores de anuncios, donde la velocidad lo es todo. Rápido y escalable, Node.js es la tecnología elegida para los dispositivos y aplicaciones IoT de uso intensivo de datos y en tiempo real.

Node.js convirtió a JavaScript en la tecnología full-stack elegida para el desarrollo de aplicaciones web. Debido a su arquitectura de no bloqueo, Node.js funciona bien para la codificación y transmisión de vídeo y audio, la carga de múltiples archivos y la transmisión de datos. Esto último podría ser extremadamente útil para el software de la industria de los viajes, donde se necesita obtener datos de diferentes APIs de diferentes proveedores.

Recientemente, Node.js se ha utilizado activamente en el software de nivel empresarial. Aunque todavía hay muchas discusiones al respecto, muchas grandes empresas y organizaciones mundiales, como Capital One y la NASA, ya han adoptado Node.js. Y el ecosistema empresarial de Node.js sigue madurando con herramientas como IBM API Connect, Triton de Joyent, N|Solid de NodeSource, Red Hat OpenShift, Trace de RisingStack y otras.

Este post forma parte de nuestra serie «Lo bueno y lo malo». Para obtener más información sobre los pros y los contras de las tecnologías más populares, consulte los demás artículos de la serie:

Lo bueno y lo malo del desarrollo móvil con Xamarin

Lo bueno y lo malo del desarrollo full stack con JavaScript

Lo bueno y lo malo de ReactJS y React Native

Lo bueno y lo malo del lenguaje de programación Swift

Lo bueno y lo malo de .NET Framework Programming

Lo bueno y lo malo del desarrollo en Angular

Lo bueno y lo malo de la herramienta de automatización de pruebas Selenium

Lo bueno y lo malo del desarrollo de aplicaciones Android

Similar Posts

Deja una respuesta

Tu dirección de correo electrónico no será publicada.