Skip to content

1 Introducción a Node JS

¿Qué es Node JS?

En la manera de programación actual existen diferentes tipos de herramientas para facilitar el trabajo a la hora de realizar una aplicación, incluso esas herramientas nos permiten realizar diferentes tipos de aplicaciones y/o proyectos. Por ejemplo, tenemos librerías que nos facilitan el desarrollo front-end (React), frameworks que nos permiten crear aplicaciones multiplataformas (Flutter), etc.

Sin embargo, Node JS no entraría en ninguna de estas categorías, ya que no se considera ni una librería, ni un framework. Por el contrario, **Node JS es un entorno de ejecución para Javascript que permite ejecutar Javascript sin necesidad de hacer uso de un navegador.

Algunas de las características que podemos encontrar en este entorno son:

  • Es de código abierto, haciendo uso de la licencia MIT.
  • Es multiplataforma.
  • Asíncrono y controlado por eventos. Todas las APIs (módulos) de NodeJs son asíncronos, es decir, no realizan operaciones bloqueantes.
  • Es un entorno de ejecución muy rápida.
  • No realiza almacenamiento en buffer.
  • Los procesos se realizan en un solo hilo, ya que Node JS es mono-hilo pero aun así es altamente escalable.

Uno de los motivos de que Node JS tenga esas características es que utiliza el motor V8, que es el mismo motor usado en el navegador Chrome. La ventaja de esto es que se puede obtener todas las ventajas de una aplicación Javascript en el entorno de Chrome pero haciendo uso de ellas en un entorno totalmente diferente.

Node JS también está orientado a eventos, es decir,va ejecutando tareas mientras espera respuestas de otros tareas, haciendo todo esto en un único hilo.

Ventajas y desventajas de usar Node JS

Algunas de las ventajas que encontramos a la hora de usar Node JS son:

  • Rendimiento y escalabilidad: Haciendo uso del motor V8 permite gestionar múltiples conexiones simultáneas sin bloquear el proceso principal.
  • Facilidad de aprendizaje: Dado que Javascript es un lenguaje fácil y popular y con una gran curva de aprendizaje.
  • Gran ecosistema de paquetes y comunidad: Existe un gran ecosistemas de paquetes (Node JS tiene uno de los más grandes actualmente) lo que facilita la reutilización y compartición de código. Además, la comunidad es activa y colaborativa permitiendo así un intercambio de conocimientos y soluciones.
  • Programación asíncrona: Al usar programación asíncrona impide que el hilo principal se bloquee.

Por el contrario, Node JS también tiene una serie de desventajas:

  • Programación asíncrona: La programación asíncrona requiere puede ser un poco compleja para los desarrolladores acostumbrados a la programación síncrona, además puede ser lioso el manejo de errores.
  • Falta de soporte para la programación multihilo: Actualmente, no existe módulos dentro de Node JS que traten el tema de los multihilos. Sin embargo, existen diferentes librerías externas que nos permite poder trabajar con ellas.

Motivos para aprender Node JS

  1. Gran demanda en el mercado, ya que Node JS es tan versátil que las empresas lo usan para diferentes escenarios. Además, Node JS pertenece a MERN Stack (**M**ongoDB **E**xpress **R**eact **N**odeJS) y al MEAN Stack, (**M**ongoDB **E**xpress **A**ngular **N**odeJS) que son soluciones de software para desarrollar aplicaciones web de forma rápida y sencilla.
  2. Se puede usar los conocimientos de Javascript en Node JS.
  3. Tiene una gran comunidad y un gran ecosistema.
  4. Rápido, escalable, fácil y barato de desplegar.

A pesar de que sea monoproceso, eso en ciertos caso puede llevar una gran ventaja.

Historia

Node fue creado en 2009 por Ryan Dahl programador en ese entonces de la empresa Joyent (dedicada a ofrecer servicios de cómputo en la nube) que a su vez se convirtió en la propietaria de la marca Node.js™ y la que le daría patrocinio y difusión desde el momento de su creación.

Joyent puso todo su empeño para el desarrollo de Node, sin embargo, al ser una empresa del sector privado y no una comunidad o fundación, los avances de Node comenzaron a ser muy lentos, en comparación de lo que la comunidad solicitaba y que también quería contribuir.

Con el paso del tiempo y durante los siguientes 5 años (2009 a 2014) se fueron entregando versiones de Node a paso de tortuga pues nunca se llego como tal a una versión 1.0.0 estable, la última versión de Node bajo la gobernabilidad de Joyent fue la 0.12.7.

La comunidad al ver el brillante futuro que podría tener Node en el ecosistema web y la insuficiencia (o incompetencia) de Joyent para sacarlo adelante, decide tomar cartas en el asunto e intenta contribuir al core de Node, sin embargo Joyent se opone a reconocer cualquier cambio no supervisado por ellos bajo el nombre comercial de Node.js™, por lo que la comunidad decide lanzar un fork amigable de Node compatible con npm y liderado bajo un modelo de gobernabilidad abierta con el nombre de io.js.

Con io.js el entorno de Node ganó mejoras que se venían esperando desde hace mucho tiempo tales como:

  • Soporte para las últimas versiones de V8 y ES6
  • Desarrollo activo haciendo liberaciones semanales
  • Integración continua y ejecución de pruebas al 100%
  • Vinculación con la comunidad
  • Gobernabilidad abierta por la comunidad y no por empresas
  • Hoja de ruta predecible
  • Versiones compatibles con SemVer
  • Comienza a incrementar su actividad nuevamente

La reacción de Joyent, propietario de Node.js™ fue lanzar la versión 0.12.1 que la comunidad estaba esperando desde hacía 2 años, sin embargo y por la premura y sorpresa de io.js salió con un par de errores por lo que tuvieron que lanzar una versión 0.12.2 en cuestión de días. Con ello Joyent logra mantener la paridad de características con io.js. Es importante mencionar que todo esto sucede en diciembre del 2014 y io.js se libera oficialmente el 13 de enero del 2015. Después de un par de meses de la liberación de io.js, ambas partes, comunidad y Joyent manifiestan su intención de reconciliar los proyectos en uno sólo, la fundación Linux se ofrece como mediador de la situación y entonces el 8 de mayo del 2015 se crea la Node.js Foundation encargada de reunificar las tecnologías en una sola, dicho proyecto lo llamaron Node.js Convergence.

Los objetivos de dicha fundación eran claros:

  • Crear un consejo de fundación encargado de la parte legal, marca, mercadotecnia y fondos gestionado por Joyent.
  • Crear un comité técnico que actué de forma independiente y permita el crecimiento del ecosistema JS en el servidor gestionado por la comunidad.
  • Normalizar y unificar las versiones actuales de Node.js™ (0.12.X) y io.js (3.X.X) en una sola tecnología.

Finalmente el 8 de septiembre del 2015 sale a la luz esa convergencia en Node 4.0.0 (estable) y con ello un futuro interesante para JavaScript en el servidor.

Desde su nacimiento de io.js se fueron liberando versiones semanales hasta llegar a la versión 3.3.0, en consideración a esta evolución y al fuerte compromiso de la comunidad activa que se matuvo viva y fuerte por hacer crecer el ecosistema de JavaScript en el servidor es que se decide relanzar Node en la versión 4.0.0.

Instalación

Para instalar Node JS existen dos formas para poder realizarlo. La primera de ellas, es ir directamente a la página oficial de Node JS. En este método tenemos que tener que diferencias dos tipos de versiones:

  • Versión LTS (Long-term supported): Esta versión es la recomendada por lo mismo desarrolladores de Node JS, ya que es la versión estable, la cual permite obtener la última versión con un mejor soporte y con mayor duración de la misma.
  • Versión Actual: Esta es la última versión oficial de Node JS, pero al ser la última y la más nueva puede que algunas funciones no funcionen como deberían, lo que hace que no sea una versión estable.

A veces, trabajamos con tantos proyectos a la vez que cada uno de ellos se ejecuta en una versión diferente de Node JS, esto puede acarrear problemas, por ello existen diferentes manejadores que permiten tener en un mismo sistema operativo diferentes versiones de Node JS, de esta forma poder tener diferentes proyectos con diferentes versiones.

Una de las más conocidas es nvm, que puede ser instalado en Linux y MacOS (para Windows existe una versión específica nvm-windows) y fnm es otra de las recomendadas.

Otra forma de poder tener diferentes versiones en diferentes proyectos es haciendo uso de la dockerización a través de contenedores Docker.

Primeros Pasos

Una vez instalada Node JS con el método elegido, podemos comprobar que todo está correctamente instalado haciendo uso del siguiente comando:

node --version # v18.17.0

Haciendo uso del comando node se nos habilitará la consola de Node JS la cual, a través del repl (bucle infinito que va tramitando el Javascript que se va solicitando) nos permitirá ejecutar código Javascript sin necesidad de almacenarlo en ningún fichero.

> const saludo = "Hola Mundo"
undefined
> console.log(saludo)
hola
undefined
> function suma(a,b){ return a + b }
undefined
> console.log(suma(1,2))
3
undefined
>

Haciendo uso del comando node FILE_NAME.js, donde FILE_NAME es el nombre del fichero donde se almacena el código Javascript, se puede ejecutar el código incrustado en el fichero desde la misma consola.

const saludo = "Hola mundo"
const suma = (a, b) => a + b

console.log(saludo)
console.log(suma(1, 2))
> node index.js
Hola mundo
3

Variable globalThis

Cuando ejecutamos un archivo Javascript desde el navegador la variable global es la variable window, con la cual podemos acceder a otras variables y métodos como console, document, etc. pero cuando se ejecuta Javascript desde la consola Node JS no podemos acceder a la variablewindow ya que es una variable del navegador. ¿Entonces como se puede acceder al objeto console si no se puede acceder a window? La variable global para la consola es global.

La variable global globalThis es la variable global que se utiliza para acceder a la variable global del entorno en el que se ejecute Javascript desde Node JS. De esta forma se puede acceder a las propiedades, objetos y métodos como console. Si ejecutamos Node JS desde la consola accederemos a la variable global global y si lo ejecutamos en el navegador apuntará a window. Por eso es importante que cada vez que se quiera acceder a la variable global desde Node JS se use globalThis.

Warning

Si estamos ejecutando una aplicación de consola con Node JS no es recomendable usar global ya que puede crear confusión con la variable globalThisque es la que se recomienda usar para así evitar errores.