JavaScript es uno de los lenguajes de programación más populares del mundo. Hoy en día, impulsa millones de sitios web y ha atraído a montones de desarrolladores y diseñadores para crear funciones para la web. Si eres nuevo en la programación, JavaScript es fácilmente uno de los mejores lenguajes de programación para conseguir bajo tu cinturón.

Durante sus primeros 20 años, JavaScript se utilizó principalmente para la creación de scripts del lado del cliente. Dado que JavaScript sólo podía utilizarse dentro de la etiqueta <script>, los desarrolladores tenían que trabajar en múltiples lenguajes y marcos entre los componentes del front-end y del back-end. Más tarde llegó Node.js, que es un entorno de ejecución que incluye todo lo necesario para ejecutar un programa escrito en JavaScript.

Node.js es un entorno de ejecución de un solo hilo, de código abierto y multiplataforma para crear aplicaciones de red y del lado del servidor rápidas y escalables. Se ejecuta en el motor de ejecución de JavaScript V8, y utiliza una arquitectura de E/S basada en eventos y sin bloqueos, lo que la hace eficiente y adecuada para aplicaciones en tiempo real.

¿En qué está escrito Node.js?

Node.js está escrito en C, C++ y JavaScript.

Wikipedia define Node.js como «una compilación empaquetada del motor JavaScript V8 de Google, la capa de abstracción de la plataforma libuv y una biblioteca central, que a su vez está escrita principalmente en JavaScript».

El tiempo de ejecución utiliza internamente Chrome V8, que es el motor de ejecución de JavaScript, y también está escrito en C++. Esto añade casos de uso adicionales al repertorio de Node.js, como el acceso a la funcionalidad interna del sistema (como la red).

Arquitectura de Node.js y su funcionamiento

Node.js utiliza la arquitectura «Single Threaded Event Loop» para manejar múltiples clientes al mismo tiempo. Para entender en qué se diferencia de otros tiempos de ejecución, tenemos que entender cómo se manejan los clientes concurrentes multihilo en lenguajes como Java.

En un modelo de solicitud-respuesta multihilo, varios clientes envían una solicitud y el servidor procesa cada una de ellas antes de devolver la respuesta. Sin embargo, se utilizan múltiples hilos para procesar las llamadas concurrentes. Estos hilos se definen en un pool de hilos, y cada vez que llega una petición, se asigna un hilo individual para manejarla.

 

 

Cómo procesa node.js las peticiones entrantes utilizando el bucle de eventos
Cómo procesa node.js las peticiones entrantes utilizando el bucle de eventos

 

Node.js funciona de forma diferente. Echemos un vistazo a cada paso que atraviesa:

  1. Node.js mantiene un pool de hilos limitado para atender las peticiones.
  2. Cada vez que llega una solicitud, Node.js la coloca en una cola.
  3. Ahora, el «bucle de eventos» de un solo hilo -el componente principal- entra en escena. Este bucle de eventos espera las peticiones indefinidamente.
  4. Cuando llega una solicitud, el bucle la recoge de la cola y comprueba si requiere una operación de entrada/salida (E/S) de bloqueo. Si no es así, procesa la solicitud y envía una respuesta.
  5. Si la solicitud tiene una operación de bloqueo que realizar, el bucle de eventos asigna un hilo del pool de hilos internos para procesar la solicitud. Los hilos internos disponibles son limitados. Este grupo de hilos auxiliares se llama grupo de trabajadores.
  6. El bucle de eventos rastrea las solicitudes que se bloquean y las coloca en la cola una vez que se procesa la tarea que se bloquea. Así es como mantiene su naturaleza no bloqueante.

Dado que Node.js utiliza menos hilos, utiliza menos recursos/memoria, lo que resulta en una ejecución más rápida de las tareas. Así que para nuestros propósitos, esta arquitectura de un solo hilo es equivalente a la arquitectura multihilo. Cuando uno necesita procesar tareas con muchos datos, entonces tiene mucho más sentido utilizar lenguajes multihilo como Java. Pero para aplicaciones en tiempo real, Node.js es la opción obvia.

Características de Node.js

Node.js ha crecido rápidamente en los últimos años. Esto es gracias a la vasta lista de características que ofrece:

  1. Easy – Node.js es bastante fácil de empezar. Es una opción para los principiantes en el desarrollo web. Con un montón de tutoriales y una gran comunidad, empezar es muy fácil.
  2. Escalable – proporciona una gran escalabilidad para las aplicaciones. Node.js, al ser de un solo hilo, es capaz de manejar un gran número de conexiones simultáneas con un alto rendimiento.
  3. Velocidad – La ejecución de hilos sin bloqueo hace que Node.js sea aún más rápido y eficiente.
  4. Paquetes – existe un amplio conjunto de paquetes de Node.js de código abierto que pueden simplificar tu trabajo. Actualmente hay más de un millón de paquetes en el ecosistema NPM.
  5. Sólido respaldo – Nodo.js está escrito en C y C++, lo que le confiere rapidez y añade características como la compatibilidad con redes.
  6. Multiplataforma – el soporte multiplataforma le permite crear sitios web SaaS, aplicaciones de escritorio e incluso aplicaciones móviles, todo ello utilizando Node.js.
  7. Maintainable – Node.js es una opción fácil para los desarrolladores ya que tanto el frontend como el backend pueden ser gestionados con JavaScript como un único lenguaje.

Tamaño del mercado

El crecimiento de los sitios web ha sido inmenso en las últimas dos décadas y, como era de esperar, Node.js también está creciendo rápidamente. El popular tiempo de ejecución ya superó el umbral de los mil millones de descargas en 2018 y, según W3Techs, Node.js es utilizado por el 1,2% de todos los sitios web de todo el mundo. Eso es más de 20 millones de sitios totales en todo Internet.

No es sorprendente que también sea una selección popular entre millones de empresas. Aquí hay algunas populares que utilizan Node.js hoy en día:

  • Twitter
  • Spotify
  • eBay
  • Reddit
  • LinkedIn
  • Godaddy

Aplicaciones de Node.js

Aplicaciones de Node.js
Aplicaciones de Node.js

 

Node.js se utiliza para una gran variedad de aplicaciones. Vamos a explorar algunos casos de uso populares en los que Node.js es una buena opción:

  1. Chats en tiempo real – Debido a su naturaleza asíncrona de un solo hilo, Node.js es muy adecuado para procesar la comunicación en tiempo real. Se puede escalar fácilmente y se utiliza a menudo en la construcción de chatbots. Node.js también facilita la creación de funciones de chat adicionales, como el chat multipersonal y las notificaciones push.
  2. Las aplicaciones de Internet de las Cosas – IoT suelen estar formadas por múltiples sensores, ya que suelen enviar pequeños trozos de datos que pueden acumularse en un gran número de peticiones. Node.js es una buena opción, ya que es capaz de gestionar estas peticiones concurrentes con rapidez.
  3. Streaming de datos – Empresas como Netflix utilizan Node.js para el streaming. Esto se debe principalmente a que Node.js es ligero y rápido, además de que Node.js proporciona una API de streaming nativa. Estos flujos permiten a los usuarios canalizar las solicitudes entre sí, lo que hace que los datos se transmitan directamente a su destino final.
  4. Aplicaciones complejas de una sola página (SPA) – en las SPA, toda la aplicación se carga en una sola página. Esto suele significar que hay un par de peticiones realizadas en segundo plano para componentes específicos. El bucle de eventos de Node.js viene al rescate aquí, ya que procesa las solicitudes de forma no bloqueante.
  5. Aplicaciones basadas en REST API – JavaScript se utiliza tanto en el frontend como en el backend de los sitios. Así, un servidor puede comunicarse fácilmente con el frontend a través de APIs REST utilizando Node.js. Node.js también proporciona paquetes como Express.js y Koa que facilitan aún más la creación de aplicaciones web.

¿Es Node.js un lenguaje de programación?

En una palabra: no.

Node.js no es un lenguaje de programación. Más bien, es un entorno de ejecución que se utiliza para ejecutar JavaScript fuera del navegador.

Node.js tampoco es un framework (una plataforma para desarrollar aplicaciones de software). El tiempo de ejecución de Node.js se construye sobre un lenguaje de programación -en este caso, JavaScript- y ayuda a la ejecución de los propios frameworks.

En resumen, Node.js no es un lenguaje de programación ni un marco de trabajo; es un entorno para ellos.

¿Es Node.js Frontend o Backend?

Un error común entre los desarrolladores es que Node.js es un framework de backend y que sólo se utiliza para construir servidores. Esto no es cierto: Node.js puede utilizarse tanto en el frontend como en el backend.

Una de las razones por las que los frameworks Node.js son una opción popular para los desarrolladores que construyen un backend flexible y escalable es su naturaleza basada en eventos y sin bloqueos. Sin embargo, los desarrolladores de frontend verán estos beneficios de Node.js en su propio trabajo con la misma claridad.

Veamos por qué Node.js funciona tanto para el backend como para el frontend:

  1. Reusabilidad – JavaScript es un lenguaje común que se utiliza para escribir tanto el backend como el frontend con la ayuda de frameworks como Express.js y Meteor.js. Algunas pilas populares como MERN utilizan Express.js como backend (un framework Node.js). También se pueden reutilizar múltiples componentes entre el frontend y el backend.
  2. Productividad y eficiencia de los desarrolladores – gracias a la reducción del cambio de contexto entre varios lenguajes, se puede ahorrar mucho tiempo a los desarrolladores. El uso de JavaScript tanto para el backend como para el frontend se traduce en una mayor eficiencia, ya que muchas herramientas son comunes para ambos.
  3. Enorme comunidad – Una comunidad online próspera es un factor que contribuye a la velocidad de un ciclo de desarrollo exitoso. Cuando te quedas atascado en un problema, es muy probable que alguien ya lo haya resuelto y compartido la solución en Stack Overflow. Node.js hace un gran uso de esta comunidad, que es activa y comprometida cuando se trata del popular tiempo de ejecución y sus paquetes.

Introducción a Node.js

Puede ser abrumador decidir por dónde empezar con Node.js. Afortunadamente, es bastante sencillo de instalar, y luego podrás probarlo por ti mismo.

Cómo instalar Node.js

Si ya tienes Node.js instalado, puedes pasar de esta sección.

En macOS

Uso de Bash en Mac

curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"

Uso de Homebrew en Mac

brew install node

En Windows

Descargua el instalador de Windows directamente desde el sitio web nodejs.org.

En Linux

En Ubuntu 18.04+ puedes instalar Node usando los siguientes comandos.

sudo apt update
sudo apt install nodejs

Comprueba la versión de Node.js instalada

En la sección anterior, hemos instalado con éxito Node. Vamos a verificarlo comprobando la versión instalada. Ejecuta el siguiente comando en la terminal.

node -v

También puede comprobarlo a través de la bandera más larga

node --version

Debería ver una salida similar a esta. Aunque el número de versión puede variar.

v14.16.0

¿Qué es el MNP?

NPM es el ecosistema de paquetes de Node.js. Es el mayor ecosistema de todas las bibliotecas de código abierto del mundo, con más de un millón de paquetes y creciendo. El uso de NPM es gratuito y miles de desarrolladores de código abierto contribuyen a él diariamente.

NPM viene con una utilidad de línea de comandos fuera de la caja. Sólo tienes que dirigirte al sitio web de NPM para buscar el paquete que necesitas e instalarlo con un solo comando. También puedes gestionar las versiones de tus paquetes, revisar las dependencias e incluso configurar scripts personalizados en tus proyectos a través de esta utilidad de línea de comandos. Sin duda, NPM es la posesión más querida por la comunidad de Node.js; Node.js atrae a un gran número de desarrolladores debido en gran parte a su excelente soporte de paquetes.

Instalación de paquetes NPM a través de la CLI

Cuando instalas Node.js, NPM se instala automáticamente junto con él. Hemos cubierto cómo instalar Node.js en las secciones anteriores, así que ahora vamos a echar un vistazo al comando para instalar un paquete con NPM:

npm install <package-name>

Sí, es así de fácil. Incluso puedes instalar varios paquetes a la vez:

npm install <pkg-1> <pkg-2> <pkg-3>

También puede especificar la bandera -g (global) si desea instalar un paquete en el contexto global. Esto te permite utilizar el paquete en cualquier lugar de tu máquina.

Cuando se inicializa una nueva aplicación, NPM crea automáticamente un archivo package.json que consiste en todos los paquetes NPM. Es aquí donde puedes especificar versiones, dependencias y scripts personalizados.

Hay una larga lista de comandos que vienen con la utilidad NPM, incluyendo publish, audit, run, y más. Puedes comprobar cómo usarlos usando el comando npm help.

Versión de Node y npm.
Versión de Node y npm.

Paquetes populares

Estos son algunos de los paquetes más populares para Node.js en la actualidad:

  • Express – Express.js, o simplemente Express, es un marco de desarrollo web inspirado en Sinatra para Node.js, y el estándar de facto para la mayoría de las aplicaciones Node.js que existen actualmente.
  • MongoDB – El controlador oficial de MongoDB. Proporciona la API para las bases de datos de objetos MongoDB en Node.js.
  • Socket.io – Socket permite la comunicación en tiempo real, bidireccional y basada en eventos.
  • Lodash – Lodash hace que JavaScript sea más fácil al eliminar las molestias de trabajar con matrices, números, objetos, cadenas, etc.
  • Moment – Una biblioteca de fechas en JavaScript para analizar, validar, manipular y dar formato a las fechas.
  • Commander.js – Esto es todo lo que necesitas para trabajar y construir con interfaces de línea de comandos para node.js.
  • Forever – Una sencilla herramienta CLI para asegurar que un determinado script se ejecute continuamente (es decir, para siempre). Mantiene tu proceso Node.js en producción ante cualquier fallo inesperado.
  • Async – Un módulo de utilidad que proporciona funciones sencillas y potentes para trabajar con JavaScript asíncrono.
  • Redis – Una biblioteca cliente para soportar la integración de la base de datos Redis.
  • Mocha – Un marco de pruebas de JavaScript limpio y flexible para Node.js y el navegador.
  • Passport – Autenticación simple y discreta para Node.js. El único propósito de Passport es autenticar las solicitudes.

Hola mundo en Node.js

Como siempre, vamos a empezar con el programa básico «Hello World», donde crearemos un servidor en Node.js que devolverá una salida «Hello World» en una petición al servidor. Antes de que te sumerjas, asegúrate de tener un buen editor de texto.

Una vez que hayas abierto tu editor de texto, este es el código que utilizarás para tu programa «Hola Mundo»:

// server.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World! Welcome to Node.js');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Guarda este archivo como `server.js`. Ahora dirígete a la terminal e inicia el servidor usando el comando

node server.js

El servidor debería empezar a funcionar ahora. Para verificar la salida, abra http://localhost:3000 en su navegador. Debería ver el mensaje –

Hello World! Welcome to Node.js

Explicación del servidor Hello World

Node.js viene con un módulo incorporado llamado «HTTP» que permite a Node.js transferir datos a través del Protocolo de Transferencia de Hipertexto (HTTP).

En el código anterior, primero cargamos el módulo http en nuestro programa. Luego usamos el método createServer para aceptar una petición y devolver una respuesta con un código de estado. Finalmente, escuchamos en un puerto definido.

Felicidades, ¡acabas de crear tu primer servidor en Node.js! En la siguiente sección, aprenderemos a usar el framework Express para crear un servidor.

Creación de un servidor mediante Express

En primer lugar, deberíamos hablar de lo que es un servidor. Un servidor es responsable de tomar las solicitudes de los clientes a través de su software (más comúnmente Apache o Nginx), realizando el conjunto de tareas requeridas, y finalmente enviando las respuestas a los clientes. Express es un framework que nos ayudará a crear un servidor en Node.

Express.js es un framework de aplicaciones web Node.js mínimo y flexible que proporciona un conjunto robusto de características para aplicaciones web y móviles. Permite añadir tablas de rutas y configurar middleware en tu aplicación. Puedes instalar Express usando el siguiente comando.

npm install express --save

En la sección anterior, utilizamos la utilidad http incorporada para crear un servidor. Ahora, vamos a crear un servidor «Hello World» utilizando Express.js.

Abre tu editor de texto e introduce este código:


// server-express.js
const express = require('express')
const app = express() // initialize app
const port = 3000

// GET callback function returns a response message
app.get('/', (req, res) => {
res.send('Hello World! Welcome to Node.js')
})

app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`)
})

A continuación, ejecutaremos nuestro servidor con el siguiente comando.

node server-express.js

Ahora comprueba http://localhost:3000 en tu navegador para ver la salida de «Hola Mundo».

Resumen

En pocas palabras, Node.js es un popular entorno de programación que puede utilizarse para crear aplicaciones a gran escala que necesiten soportar múltiples peticiones concurrentes. La E/S no bloqueante de un solo hilo lo convierte en una excelente opción para aplicaciones en tiempo real y de flujo de datos.

Para reforzarlo aún más, Node.js cuenta con una comunidad masiva de desarrolladores activos y con el mayor repositorio de paquetes de código abierto del mundo, NPM, que actualmente contiene más de un millón de paquetes.

Es fácil empezar con Node.js. Hemos cubierto cómo instalar y crear un servidor en Node.js, así que todo lo que queda es considerar cómo vas a usar e implementar Node.js en tu propia pila. También puedes ampliar tus conocimientos visitando la documentación oficial de Node.js en nodejs.dev.