Top 5 de la semana

Publicidad

Artículos relacionados

Node.js 22: Novedades y una Kata Inspirada en Talent Arena

La nueva versión de Node.js 22 trae mejoras importantes en rendimiento, seguridad y compatibilidad con las últimas características de JavaScript. Vamos a repasar los cambios más relevantes y además te proponemos una kata práctica inspirada en el Talent Arena que se celebra en Barcelona.

Novedades principales de Node.js 22

Motor V8 actualizado a la versión 12.4

Esta actualización mejora el rendimiento general. Además, añade funciones como Array.fromAsync, nuevos métodos para Set y optimizaciones en la gestión de memoria para WebAssembly.

Activación del compilador Maglev

El compilador Maglev ahora está habilitado por defecto en sistemas compatibles. Esto acelera la ejecución de programas de corta duración, algo muy útil en proyectos que requieren rapidez.

Soporte experimental para require() en módulos ES

Se incorpora la opción --experimental-require-module. Gracias a ella, ahora es posible cargar módulos ES de forma síncrona, facilitando su integración en proyectos existentes.

Mejoras de seguridad

Con Node.js 22 llega una actualización en TLS y mejoras en la validación de certificados, reforzando la protección contra posibles ataques.

Optimización del sistema de módulos

Se ha mejorado la compatibilidad y el rendimiento de los módulos ES. Esto hace que sea más sencillo aprovechar la sintaxis moderna de JavaScript en nuestros proyectos Node.js.

Kata práctica: Gestión de sesiones en Talent Arena

Para poner en práctica estas novedades, te proponemos una kata que simula la gestión de participantes en un evento como Talent Arena, usando las nuevas características de Node.js 22.

Objetivo

Desarrollar una pequeña aplicación que permita:

  • Registrar participantes usando Array.fromAsync.
  • Asignar sesiones evitando duplicados con Set.
  • Notificar cambios en tiempo real mediante WebSockets.
  • Generar reportes de participantes utilizando iteradores.

Consideraciones técnicas

  • Optimizar la ejecución con el compilador Maglev.
  • Aplicar mejoras de seguridad usando TLS actualizado.
  • Utilizar módulos ES para una organización moderna del código.

¿Listo para empezar? Vamos paso por paso.

Paso 1: Configurar el proyecto

Primero, crea una carpeta y configura tu proyecto:

mkdir talent-arena
cd talent-arena
npm init -y

Asegúrate de tener instalada la versión 22 de Node.js (node -v). Si no, descárgala desde la página oficial de Node.js.

Paso 2: Registrar participantes

Vamos a usar Array.fromAsync para procesar participantes de manera asíncrona:

// participants.js
export async function fetchParticipants() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(["Alice", "Bob", "Charlie", "David"]);
        }, 1000);
    });
}

export async function registerParticipants() {
    const participants = await fetchParticipants();
    const processed = await Array.fromAsync(participants, async (participant) => {
        return { name: participant, registeredAt: new Date() };
    });
    return processed;
}

Con fetchParticipants() simulamos cargar datos desde un servidor, y Array.fromAsync() transforma cada participante de manera eficiente.

Paso 3: Asignar sesiones sin duplicaciones

Ahora organizamos a los participantes en sesiones sin duplicados usando Set:

// sessions.js
export function assignSessions(participants) {
    const session1 = new Set();
    const session2 = new Set();
    participants.forEach((participant, index) => {
        if (index % 2 === 0) {
            session1.add(participant.name);
        } else {
            session2.add(participant.name);
        }
    });
    return { session1: [...session1], session2: [...session2] };
}

Así conseguimos una distribución ordenada y sin riesgos de repetir participantes.

Paso 4: Notificaciones en tiempo real con WebSockets

Instalamos la librería ws:

npm install ws

Y configuramos el servidor WebSocket:

// server.js
import { WebSocketServer } from 'ws';

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', (ws) => {
    console.log('Cliente conectado');
    ws.send(JSON.stringify({ message: "Bienvenido a Talent Arena!" }));

    ws.on('message', (data) => {
        console.log(`Mensaje recibido: ${data}`);
    });

    ws.on('close', () => {
        console.log('Cliente desconectado');
    });
});

console.log("Servidor WebSocket corriendo en ws://localhost:8080");

Este servidor enviará un mensaje de bienvenida a cada nuevo participante.

Paso 5: Generar reportes usando iteradores

Ahora generamos un informe detallado de todos los participantes:

// reports.js
export function generateReport(participants) {
    function* reportGenerator() {
        for (const participant of participants) {
            yield `Participante: ${participant.name}, Registrado el: ${participant.registeredAt}`;
        }
    }

    const report = [];
    for (const entry of reportGenerator()) {
        report.push(entry);
    }
    return report;
}

Así podemos crear reportes sin necesidad de cargar toda la lista en memoria al mismo tiempo.

Paso 6: Integrar todo en un solo flujo

Finalmente, juntamos todas las piezas en un archivo principal:

// index.js
import { registerParticipants } from './participants.js';
import { assignSessions } from './sessions.js';
import { generateReport } from './reports.js';

async function main() {
    const participants = await registerParticipants();
    console.log("Participantes Registrados:", participants);

    const sessions = assignSessions(participants);
    console.log("Sesiones Asignadas:", sessions);

    const report = generateReport(participants);
    console.log("Reporte de Participantes:\n", report.join("\n"));
}

main();

Para ejecutar el proyecto:

node index.js

¿Te ha gustado esta kata sobre Node.js 22?
Si quieres seguir aprendiendo y explorar más ejercicios prácticos, no dudes en visitar la web oficial.

Normas para comentar

Este espacio está abierto a todo el mundo, pero para que funcione bien necesitamos un poco de sentido común. No se permiten comentarios ofensivos, spam, ni enlaces promocionales. Respeta a los demás, escribe con educación y trata de aportar al tema.

Los comentarios que no sigan estas normas serán eliminados.

Gracias por mantener un buen ambiente.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí