¿Qué es Node.js?
Cuando se trata de aprender un nuevo idioma o, en este caso, una plataforma, siempre es pertinente recurrir a la documentación oficial. En el caso de Node.js, la definición comienza así (en inglés):
“Node.js is an open-source and cross-platform JavaScript runtime environment. It is a popular tool for almost any kind of project!
Node.js runs the V8 JavaScript engine, the core of Google Chrome, outside of the browser. This allows Node.js to be very performant”.
Node.js no es un lenguaje de programación, sino una multiplataforma que se ejecuta en un entorno JavaScript, mientras que el lenguaje utilizado es el propio js. Node.js se ejecuta sobre el motor V8, núcleo de Google Chrome. En este caso, Node interpreta y ejecuta el código JavaScript incluso fuera del navegador. Antes, el código js solo se ejecutaba dentro del propio navegador, pero tras la creación de Node es posible hacer mucho más con JavaScript, así como con otros lenguajes interpretados.
¿Por qué Node.js?
Aquí estoy en otro de los textos hablando de otro stack que he tenido el placer de trabajar escribiendo aplicaciones. Ya trabajé con Node.js en una de mis empresas: hacía el papel de una API web entre una aplicación móvil híbrida con una base de datos. En esta instancia, la aplicación se encargó de liberar el acceso a los paquetes pagos en mi negocio. Una señora responsabilidad, ¿no?
En otro trabajo, esta vez para una empresa que se encargaba de pagar automáticamente las facturas de sus clientes a través de sus tarjetas de crédito, se utilizó Node.js para acceder a los servicios de proveedores de facturas de agua, luz, teléfono y devolver las tajadas a la otra aplicación que en realidad realizó los pagos a través de otro servicio que cargó la tarjeta del cliente.
Arriba hay dos ejemplos muy distintos pero muy críticos de aplicaciones que funcionan con Node.js y la web está llena de ellos. A continuación, hablaremos un poco más sobre las razones para usar Node.js.
- Mucha velocidad a pesar de tener solo 1 subproceso: de manera simplificada, NodeJS es asíncrono y de un solo subproceso (el factor de un solo subproceso no es tan simple, como lo ilustra este artículo). Esto significa que las operaciones no se bloquearán entre sí (de hecho, se ejecutarán simultáneamente). Entonces, una operación no esperará a que la otra termine para que otra comience a ejecutarse, sino que todas se ejecutarán al mismo tiempo usando el bucle de eventos. Esto sucede sin que Node cree un nuevo hilo para cada operación. Así que puedes preguntarte: pero ¿qué pasa, por ejemplo, si una operación tarda unos segundos en ejecutarse?, ¿cómo la afronta esta plataforma? Node continuará realizando todas las operaciones y devolverá la respuesta cuando se devuelva, sin bloquear otras operaciones en curso. ¿Y cuál es el resultado de eso? La propia documentación oficial lo explica (en inglés) :
“This allows Node.js to handle thousands of concurrent connections with a single server without introducing the burden of managing thread concurrency, which could be a significant source of bugs”.
Es decir, se obtiene la posibilidad de soportar múltiples conexiones u operaciones sin introducir la necesidad de introducir complejidad de subprocesos.
- Baja curva de aprendizaje: debido a que está escrito en el idioma nativo de la web, JavaScript Node tiene una clara ventaja sobre los demás: ya hay millones de desarrolladores front-end capaces de escribir aplicaciones en Node sin pasar por una curva de aprendizaje para dominar un nuevo idioma. Al pensar en equipos Full Stack, por ejemplo, los desarrolladores pueden crear tanto la parte delantera como la trasera de la aplicación en un solo idioma. De esta forma, cualquier desarrollador (sin importar su nivel) solo requiere JavaScript para escribir la parte trasera, delantera e incluso móvil. Esto facilita la contratación, el tiempo de aprendizaje y la velocidad de desarrollo de aplicaciones entre los equipos.
- NPM: algo que un desarrollador siempre debe verificar antes de elegir un lenguaje o marco es si hay bibliotecas para lidiar con problemas comunes. Cuando necesitamos cifrar una contraseña o conectarnos a la base de datos relacional, comúnmente buscamos automáticamente una biblioteca que abstraiga la parte de nivel inferior de esta funcionalidad. De esta manera, pudimos resolver el problema con unas pocas líneas de código, importando y usando la biblioteca que se seleccionó.
Es esta necesidad la que hace que NPM, Node Package Manager, sea una gran ventaja cuando se usa Node.js. Es el mayor repositorio de software existente y cuenta con librerías para resolver los más diversos problemas. - Gran comunidad: acabamos de ilustrar un poco la importancia y utilidad de NPM para el desarrollo de aplicaciones. Es importante señalar que solo es posible tener tantas bibliotecas diferentes y una base tan grande llena de ellas debido a una comunidad que es grande, superactiva y valiosa para quienes están desarrollando. Cualquier pregunta que busques en Google o StackOverflow probablemente ya se haya hecho y respondido antes. Realmente una mano en el volante para aquellos que se desarrollan.
Casos interesantes
- Aplicaciones que se actualizan en tiempo real: imagina un gran tablero que actualiza información diversa del mercado financiero para mostrarla al usuario. Es un reto conseguir y compartir toda esta información deseada. En este caso, el bucle de eventos de Node.js puede utilizarse para crear una aplicación web que obtenga y valide esta información de forma asíncrona y sin bloqueos. ¡Y los datos se pueden enviar al tablero usando websockets!
- Data Streaming: este es uno de los conceptos fundamentales detrás de Node.js. El término streaming hace referencia a un flujo de datos, muy útil para trabajar con un gran volumen. Al usar este componente, puedes enviar y recibir fragmentos de un archivo grande y procesar tu contenido sin guardarlo en la memoria. Podemos pensar en transmisiones haciendo una analogía con escuchar una canción en alguna plataforma de streaming. En este caso, no necesitas descargar la canción antes de escucharla, sino que recibes la canción por partes, tanto que si te quedas sin internet la música seguramente se detendrá a la mitad, a menos que todas tus partes ya hayan sido descargadas.
Hay dos ventajas principales al usar esta función:
- Memoria: no es necesario asignar una gran cantidad de memoria para procesarlos. Puede asignar solo lo que necesita a ese bit de datos.
- Eficiencia de tiempo: en lugar de tener que esperar a que se transmita toda la carga de datos para procesarlos, puedes comenzar tan pronto como tengas los datos.
3. Web Scraping: este es el concepto de extraer información de páginas web. ¿Recuerdas la aplicación que mencioné en la que trabajé, un servicio que obtenía automáticamente las facturas de los clientes para pagarlas con su tarjeta de crédito? En algunas partes de esta aplicación se utilizaba Web Scraping para obtener cierta información de las cuentas y pagarlas. De esta forma, si no había apoyo oficial del proveedor de electricidad, agua y otros servicios, era posible buscar información directamente en el panel del cliente utilizando sus datos de acceso al panel del proveedor. Aquí se eligió Node.js debido a la cantidad de bibliotecas disponibles para ayudar en esta tarea, como Cheerio y Request.
Tu primer Hello World con Node.js
Ahora pongamos manos a la obra y construyamos nuestra primera aplicación en Node.
El primer paso es instalar la herramienta en tu computadora. Hay algunas variaciones de instalación dependiendo de cuál sea tu sistema operativo. Al acceder a la página principal, ya se muestran los comandos de instalación para cada sistema operativo:
Accede a la página y ejecuta los comandos necesarios. Ten en cuenta que podrían cambiar con futuras versiones de Node.
Una vez completada la instalación, crearemos el archivo index.js y colocaremos el siguiente código en su interior:
Entendamos lo que hicimos en el código anterior:
- Importamos el módulo http. Esta interfaz de Node.js es responsable de soportar las diversas funcionalidades de http, y está diseñada de manera que las solicitudes y las respuestas no se almacenen en búfer, permitiendo el uso de streams.
- Creamos un servidor usando la interfaz http con la función createServer. Esta instancia de servidor se ejecutará en el puerto 8080 y en la IP local como se define en la función listen.
- Cada vez que el servidor recibe una solicitud, se activará la función interna que le pasamos a createServer. A su vez, siempre recibirá los parámetros de solicitud y respuesta. Estos son los atributos que manipularemos para cambiar nuestra respuesta al cliente.
- Luego configuramos el encabezado y el mensaje de la respuesta con writeHead. La respuesta es HTTP 200 (OK) y el tipo de contenido (Content-Type) es text/html.
- Con la función end definimos la respuesta en texto que se enviará al cliente: Hello World.
Ahora ejecutemos nuestro servidor Node con node index.js. Al ingresar en tu navegador, escribe http://localhost:8080/, con lo que verás:
Esta respuesta es exactamente igual a la que indicamos en el código.
¡Y eso es todo, amigos! Espero que hayas disfrutado este texto. En él hicimos una breve introducción a Node.js, además de explicar las razones por las que es una plataforma tan popular y cuáles son sus principales características y particularidades. Node.js es utilizado en todo el mundo por empresas como Paypal, Netflix, Trello y muchas otras. Como se mencionó anteriormente, su capacidad para manejar múltiples solicitudes rápidamente y también porque está escrito en JavaScript se encuentran entre las principales razones de esta adopción.
Revelo Content Network da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.