Nodejs

Nodejs

1. Introducción a Node.js

Node.js es un entorno de ejecución de JavaScript que permite ejecutar código JavaScript en el lado del servidor. Fue creado por Ryan Dahl en 2009 y está basado en el motor V8 de Google Chrome. Node.js es una herramienta muy poderosa para el desarrollo de aplicaciones web y APIs RESTful, ya que permite realizar operaciones de entrada/salida de forma asíncrona y no bloqueante.

¿Por qué es Node.js?

Node.js permite manejar múltiples solicitudes simultáneamente sin bloquear el hilo principal, lo que lo hace muy eficiente para aplicaciones en tiempo real y de alta concurrencia.

Historia y Evolución de Node.js

  • 2009: Creación de Node.js por Ryan Dahl.
  • 2010: Lanzamiento de la primera versión estable.
  • 2011: Lanzamiento de npm (Node Package Manager).
  • 2012-2021: Mejora continua con nuevas versiones y características.

Características de Node.js

  • Asíncrono y no bloqueante
  • Eventos y callbacks
  • Módulos y paquetes
  • NPM (Node Package Manager)
  • Rendimiento y escalabilidad
  • Comunidad activa

2. Manejadores de Paquetes en Node.js

Los manejadores de paquetes son herramientas esenciales para la gestión de dependencias en proyectos Node.js.

npm (Node Package Manager)

  • Descripción: El manejador de paquetes por defecto para Node.js.
  • Uso Básico:
npm install <paquete>: Instala un paquete.
npm install --save-dev <paquete>: Instala un paquete para desarrollo.
npm update: Actualiza paquetes instalados.

yarn

  • Descripción: Alternativa a npm creada por Facebook, ofrece una instalación más rápida y una mejor gestión de dependencias.
  • Uso Básico:
yarn add <paquete>: Instala un paquete.
yarn add --dev <paquete>: Instala un paquete para desarrollo.
yarn upgrade: Actualiza paquetes instalados.

pnpm

  • Descripción: Un manejador de paquetes más rápido y eficiente que almacena un único conjunto de paquetes en lugar de duplicar dependencias.
  • Uso Básico:
pnpm install <paquete>: Instala un paquete.
pnpm install --save-dev <paquete>: Instala un paquete para desarrollo.
pnpm update: Actualiza paquetes instalados.

3. Manejadores de Versiones de Node.js

Los manejadores de versiones permiten gestionar múltiples versiones de Node.js en un solo sistema.

nvm (Node Version Manager)

  • Descripción: Herramienta para instalar y gestionar múltiples versiones de Node.js.
  • Uso Básico:
nvm install <version>: Instala una versión específica de Node.js.
nvm use <version>: Cambia a una versión específica.
nvm ls: Lista las versiones instaladas.

fnm (Fast Node Manager)

  • Descripción: Alternativa más rápida a nvm, también permite gestionar versiones de Node.js.
  • Uso Básico:
fnm install <version>: Instala una versión específica de Node.js.
fnm use <version>: Cambia a una versión específica.
fnm ls: Lista las versiones instaladas.

4. Entornos de Ejecución de JavaScript

Node.js no es el único entorno de ejecución para JavaScript. Aquí se presentan otras opciones que están ganando popularidad.

Node.js

  • Descripción: Entorno de ejecución de JavaScript basado en el motor V8 de Google Chrome, diseñado para ejecutar código JavaScript en el lado del servidor.
  • Características: Asíncrono, no bloqueante, amplio ecosistema de paquetes.

Deno

  • Descripción: Entorno de ejecución para JavaScript y TypeScript creado por Ryan Dahl (creador de Node.js) como una alternativa moderna a Node.js.

  • Características:

*   Soporte nativo para TypeScript.
*   Seguridad mejorada con permisos explícitos.
*   No utiliza npm, usa deno.land/x para paquetes.

Bun

  • Descripción: Un entorno de ejecución de JavaScript relativamente nuevo que se enfoca en el rendimiento y la simplicidad.
  • Características:
*   Enfocado en la velocidad y la compatibilidad.
*   Incluye un empaquetador, un administrador de paquetes y un motor de ejecución en un solo binario.
*   Compatible con Node.js en muchos aspectos, pero aún en desarrollo y evolución.

5. Fundamentos del Asincronismo en Node.js

Node.js es conocido por su modelo de programación asíncrona no bloqueante. Esto permite manejar múltiples solicitudes de entrada/salida (I/O) simultáneamente sin bloquear el hilo principal, haciendo que Node.js sea muy eficiente en operaciones que requieren acceder a archivos, bases de datos o servicios externos.

  • Sincronía vs Asincronía
*   **Sincronía:** Las operaciones se ejecutan secuencialmente.
*   **Asincronía:** Las operaciones no bloquean el hilo principal, utilizando callbacks, promesas y async/await.

6. Callbacks

Un callback es una función que se pasa como argumento a otra función y se ejecuta después de que la operación asíncrona ha finalizado.

Ejemplo de Callback:

const fs = require('fs');

// Leer un archivo de manera asíncrona usando un callback
fs.readFile('archivo.txt', 'utf8', (err, data) => {
  if (err) {
    console.error("Error leyendo el archivo:", err);
    return;
  }
  console.log("Contenido del archivo:", data);
});

Problema: Callback Hell A medida que anidamos callbacks, el código se vuelve difícil de leer y mantener.

7. Promesas

Las promesas son una forma más clara y manejable de trabajar con operaciones asíncronas.

Ejemplo de Promesa:

const fs = require('fs').promises;

fs.readFile('archivo.txt', 'utf8')
  .then(data => {
    console.log("Contenido del archivo:", data);
  })
  .catch(err => {
    console.error("Error leyendo el archivo:", err);
  });

8. Async/Await

Async/Await es una sintaxis moderna para trabajar con promesas que permite escribir código asíncrono de manera más legible.

Ejemplo de async/await:

const fs = require('fs').promises;

async function leerArchivo() {
  try {
    const data = await fs.readFile('archivo.txt', 'utf8');
    console.log("Contenido del archivo:", data);
  } catch (err) {
    console.error("Error leyendo el archivo:", err);
  }
}

leerArchivo();

9. Introducción a Node.js en la práctica

Vamos a crear una pequeña aplicación que lea archivos de manera asíncrona y envíe una respuesta utilizando un servidor básico de Node.js.

Crear un Servidor HTTP Asíncrono

const http = require('http');
const fs = require('fs').promises;

const server = http.createServer(async (req, res) => {
  try {
    const data = await fs.readFile('archivo.txt', 'utf8');
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(data);
  } catch (err) {
    res.writeHead(500, { 'Content-Type': 'text/plain' });
    res.end("Error leyendo el archivo");
  }
});

server.listen(3000, () => {
  console.log('Servidor escuchando en el puerto 3000');
});

10. Gestión de Paquetes con NPM

Node.js utiliza NPM (Node Package Manager) para instalar y gestionar dependencias.

Comandos básicos de NPM:

  • npm init: Inicia un nuevo proyecto y crea un archivo package.json.
  • npm install <paquete>: Instala un paquete.
  • npm install –save-dev <paquete>: Instala un paquete para desarrollo.
  • npm update: Actualiza paquetes instalados.
  1. Preparando el Entorno para React

Para conectar lo aprendido en Node.js con React en la próxima clase, es fundamental instalar y configurar herramientas adicionales.

Instalar create-react-app: