¿Qué es Node.js y cómo funciona?
Tags: node, javascript
Published: 2020-05-08 03:40:31

Seguramente éstos últimos años has oído hablar acerca de Node.js o has leído algún artículo destacando lo increíble que es esta herramienta, pero: **¿Qué es Node.js?**.
En este post, veremos a detalle qué es Node.js y por qué se ha vuelto tan popular últimamente.


## ¿Qué es Node.js?

**[Node.js](https://nodejs.org/) es un entorno de ejecución para ejecutar (valga la redundancia 👻) JavaScript fuera del navegador**. Es orientado por eventos, multiplataforma y de código abierto. Pero seguramente eso ya lo has leído muchas veces, así que para entender que es Node, primero veamos **qué es un entorno de ejecución**.

Antes de la llegada Node.js, JavaScript era utilizado únicamente para construir aplicaciones dentro de un navegador web. Cada navegador tiene algo llamado ***JavaScript Engine*** *(Motor de JavaScript)*, el cual toma nuestro código javascript y lo convierte en algo que el ordenador puede entender y ejecutar. Por ejemplo, Microsoft Edge usa [Chakra][chakra-docs], Firefox usa [SpiderMonkey][spidermonkey-docs] y Chrome usa [V8][v8-docs]. Y es por esta variedad de motores que a veces nuestro código se comporta de distinta manera en distintos navegadores.

Algo que también nos proporcionan los navegadores es un entorno con herramientas extra para la ejecución de nuestro código javascript, por ejemplo probablemente sepas que en un navegador tenemos el objeto `window` o el objeto `document`. Estos objetos nos permiten interactuar con el entorno en el cual se está ejecutando nuestro código (en este caso el browser).

En el año 2009, cierta mañana, [Ryan Dahl][ryan-dahl-bio] se despertó con una brillante idea, *¿no sería súper cool ejecutar JavaScript fuera de los navegadores?.* Con ésta idea en mente, **tomó el motor V8 de Google, lo embebió en un programa de C++, y nombró a éste programa Node**.

Así que, de forma similar a un navegador web, Node.js contiene un Motor de JavaScript y adicionalmente nos provee herramientas y módulos para interactuar con el entorno en el que se ejecuta.
Éstos son diferentes a los objetos que nos provee un navegador, por ejemplo en Node.js no tenemos los objetos `window` ni `document`, en vez de eso, Node.js nos provee modulos para trabajar con el sistema de archivos del SO subyacente (ejm. `fs.readFile`) o escuchar peticiones en un puerto específico (ejm `http.createServer`) y más. No podemos hacer eso en un navegador web.

Entonces, en escencia, Node.js es un programa que incluye el motor JavaScript V8 de Google mas algunos módulos adicionales que nos proveen funcionalidades no disponibles en los navegadores. Tanto Chrome como Node.js comparten el mismo motor JS, pero proveen diferentes entornos de ejecución.

<br/>

## ¿Qué NO es Node.js?

Seguramente habrás oído a mucha gente comparar Node.js con C#, Java, Python o algún otro lenguaje de programación. Pues bien, éstas comparaciones son conceptualmente erróneas, ¿por qué? porque **Node.js NO es un lenguaje de programación!**, es como comparar un zapato con una banana.

Bajo la misma premisa, las comparaciones entre Node.js y herramientas como ASP.Net, Rails, Django, o cualquier otra similar tambien son erróneas, éstos son frameworks para desarrollar aplicaciones web. **Node.js NO es un framework**, es un entorno de ejecución para correr código JavaScript.

<br/>

## Usos de Node.js

Un primer motivo para usar Node.js, podría ser que, al usar JavaScript como lenguaje, podemos crear aplicaciones con un stack basado en éste, en el que se comparten conocimientos, buenas prácticas, convenciones de nombres, etc, tanto a nivel de cliente como de backend e incluso BD, por ejemplo usando MongoDB, una base de datos no relacional con un API basada en JavaScript. Una gran inmensidad de casos de uso pueden ser cubiertos con un Stack basado en Javascript y Node.js.

Pero principalmente, **gracias a su naturaleza asíncrona y no bloqueante, Node.js es ideal para construir aplicaciones de tiempo real, altamente escalables, y de uso altamente intensivo de operaciones I/O (Input/Output)**  
Dicho ésto, con Node.js podemos construir cosas cómo:
* Juegos real-time
* Salas de chat
* Aplicaciones de recolección de datos
* Streaming
* Aplicaciones de alto tráfico y concurrencia (ej. Twitter)

Pero qué significa eso de ***"debido a su naturaleza asíncrona y no bloqueante"***?. Para entenderlo, comprendamos el funcionamiento de Node.js

<br/>

## ¿Cómo funciona Node.js?

Para entender como funciona NodeJS, haremos uso de una metáfora:  
Imagina que vas a un restaurante. El mesero te atiende, toma tu orden y la lleva a la cocina, luego va y atiende a otra mesa, mientras el cocinero prepara tu orden. Entonces, una misma persona puede atender múltiples mesas, no tiene que esperar que el cocinero temine de preparar una orden antes de pasar a atender a otra mesa. A esta naturaleza o arquitectura la llamamos ***asíncrona*** o ***no bloqueante***. Asi es como funcionan las aplicaciones de Node.js. El camarero viene a ser un ***hilo*** o ***thread*** asignado para manejar solicitudes. De esta forma un sólo hilo puede manejar multiples solicitudes.

En contraste con lo antes mencionado, tenemos las arquitecturas *síncronas* o *bloqueantes*. Volviendo a la metáfora anterior, en un restaurante de naturaleza sincrona o bloqueante, cada vez que un cliente llega al restaurante se le asigna un mesero el cual toma la orden, la lleva a la cocina, espera a que salga el pedido, lo lleva al cliente, y solo entonces puede pasar a atender a otra mesa. Frameworks como ASP.net o Rails funcionan de ésta manera: cuando una petición llega, se le asigna un hilo, lo cual potencialmente viene acompañado de una cantidad de memoria RAM. Imaginemos el caso de una aplicación como Twitter donde se tienen múchisimas conexiones simultáneas, para cada una se debe generar un hilo, y naturalmente, en algún punto, no vamos a tener mas hilos o memoria disponibles para atender mas peticiones. Entonces las nuevas peticiones deben esperar hasta que se libere algún hilo, se libere memoria, o debemos agregar mas hardware.

En Node.js no tenemos ese inconveniente, ya que un solo hilo se encarga de procesar todas las peticiones. Cuando llega una petición, el hilo de Node.js se encarga de procesarla. Si necesitamos hacer una petición a una base de datos, nuestro hilo no tiene que esperar hasta que la BD devuelva una respuesta. Mientras la petición a la base de datos se esta procesando, nuestro hilo puede atender otras peticiones. Cuando la respuesta de la base de datos está lista, se coloca en algo llamado ***Event Queue*** o ***Cola de Eventos***. Node.js  está constantemente monitoreando esta cola de eventos a mediante el ***Event Loop***, de tal manera que cuando la respuesta a alguna petición pendiente esta lista, Node.js  la toma, la procesa y la devuelve.

![Cómo Funciona Node.js](https://dev-to-uploads.s3.amazonaws.com/i/a6izr4kzubqxm8idrebc.gif)


<br />

Éste tipo de arquitectura hace a Node.js  ideal para construir aplicaciones que involucran una gran cantidad de accesos a disco, peticiones de red (consultar bases de datos, consultar servicios web), etc. Podemos atender una gran cantidad de clientes sin la urgencia de disponer de más hardware. Y es por ésto que las aplicaciones en Node.js son altamente escalables.

Por el contrario, Node.js no debe ser usado para aplicaciones que demanden un intensivo uso de la CPU, como aplicaciones de procesamiento y manipulacion de imágenes, encodificación de video o similares. Éste tipo de aplicaciones realiza gran cantidad de calculos en CPU, y, al ser Node.js mono-hilo, mientras tienen lugar éstas operaciones en CPU para una petición, otras peticiones deben esperar.

<br/>

## Conclusión

En este artículo hemos visto qué es Node.js y cómo funciona. Comprendimos por qué es ideal para construir aplicaciones altamente escalables. Vimos que Node.js tiliza un motor JavaScript extremadamente rápido, el motor V8 de Google. Entendimos tambien la diferencia entre Node.js y lenguajes de programacion o Frameworks de desarrollo web.

Ahora que tenemos estos conceptos claros, podemos responder fácilmente la interrogante inicial: **¿Qué es Node.js y como funciona?**

![ending-meme](https://dev-to-uploads.s3.amazonaws.com/i/cdnthl7i0udimdirru9y.jpg)


[spidermonkey-docs]: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey
[chakra-docs]: https://en.wikipedia.org/wiki/Chakra_(JScript_engine)
[v8-docs]: https://v8.dev/
[ryan-dahl-bio]: https://en.wikipedia.org/wiki/Ryan_Dahl