La reciente versión de Node.js 22 introduce mejoras significativas en rendimiento, seguridad y compatibilidad con las últimas características de JavaScript. A continuación, repasamos algunos de los cambios más relevantes y proponemos una kata inspirada en el Talent Arena que se celebra en Barcelona.
Novedades Principales de Node.js 22
- Actualización del Motor V8 a la versión 12.4
Se han incorporado mejoras en el rendimiento y nuevas funciones comoArray.fromAsync
, métodos paraSet
y optimización en la recolección de basura en WebAssembly. - Activación del Compilador Maglev
Ahora Maglev está habilitado por defecto en sistemas compatibles, mejorando la ejecución de programas de corta duración. - Soporte Experimental para
require()
en Módulos ES
Se ha añadido la opción--experimental-require-module
para permitir la carga sincrónica de módulos ES, facilitando su integración en proyectos existentes. - Mejoras en Seguridad
Node.js 22 incorpora actualizaciones en TLS y en la validación de certificados, reforzando la protección frente a ataques. - Optimización del Sistema de Módulos
Se ha mejorado la compatibilidad y el rendimiento de los módulos ES, lo que facilita el uso de la sintaxis moderna de JavaScript en Node.js.
Kata: Gestión de Sesiones en Talent Arena
Para ilustrar algunas de estas mejoras, esta kata propone simular la gestión de participantes en un evento como Talent Arena, utilizando algunas de las nuevas características de Node.js 22.
Objetivo
Desarrollar una aplicación en Node.js 22 que realice las siguientes funciones:
- Registrar Participantes
UtilizarArray.fromAsync
para procesar de manera asíncrona una lista de registros. - Asignar Sesiones
Implementar un sistema que distribuya participantes en sesiones sin duplicaciones, aprovechando las mejoras enSet
. - Notificaciones en Tiempo Real
Integrar WebSockets para enviar avisos sobre cambios en las sesiones. - Generar Reportes
Usar iteradores para recorrer la lista de participantes y generar informes.
Consideraciones Técnicas
- Optimizar la ejecución con el compilador Maglev.
- Aplicar mejoras de seguridad con TLS actualizado.
- Utilizar módulos ES para una mejor organización del código.
Esta kata es una oportunidad para explorar las novedades de Node.js 22 en un contexto práctico.
Pasos para Resolver la Kata
1. Configurar el Proyecto
Antes de comenzar, es necesario crear un nuevo proyecto en Node.js. Para ello, se ejecuta el siguiente comando en la terminal:
mkdir talent-arena
cd talent-arena
npm init -y
Es recomendable asegurarse de que la versión instalada de Node.js sea la 22. Se puede verificar con node -v
. Si no está actualizada, se puede descargar la última versión desde la página oficial de Node.js.
2. Registrar Participantes
Para procesar los participantes de manera asíncrona, se usa Array.fromAsync()
, una función introducida en Node.js 22. El siguiente código simula la obtención de una lista de participantes desde una fuente externa y los convierte en objetos con un campo de fecha de registro.
// 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;
}
El método fetchParticipants()
simula la carga de datos desde un servidor, mientras que Array.fromAsync()
permite transformar cada entrada de la lista sin bloquear la ejecución del código.
3. Asignar Sesiones sin Duplicaciones
Para distribuir a los participantes en diferentes sesiones sin riesgo de duplicaciones, se emplea la estructura Set
, la cual ha recibido optimizaciones en esta versión de Node.js. A continuación, se muestra cómo organizar a los asistentes en dos sesiones:
// 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] };
}
Los participantes se asignan de forma alterna entre las dos sesiones, asegurando que cada uno solo aparezca una vez, sin importar cuántas veces se intente registrarlo.
4. Notificaciones en Tiempo Real con WebSockets
Para informar a los participantes sobre cambios en las sesiones en tiempo real, se implementa un servidor WebSocket utilizando la librería ws
. Para ello, primero se instala la dependencia con:
npm install ws
Luego, se configura el servidor WebSocket, permitiendo conexiones de clientes y enviando un mensaje de bienvenida:
// 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 código permite a los clientes recibir notificaciones en tiempo real cuando haya cambios en las sesiones, facilitando la interacción dinámica entre el servidor y los participantes.
5. Generar Reportes Usando Iteradores
Para recorrer la lista de participantes y generar reportes de manera eficiente, se emplean funciones generadoras. A continuación, se presenta una implementación que itera sobre los participantes y devuelve un informe detallado.
// 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;
}
Esta solución permite recorrer la lista de manera controlada, generando los reportes sin necesidad de cargar todos los datos en memoria de una sola vez.
6. Ejecutar Todo el Proyecto
Para poner en funcionamiento todas las funcionalidades desarrolladas, se integra el código en un solo archivo que ejecuta el flujo completo del programa.
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 programa, se debe correr el siguiente comando en la terminal:
node index.js
Para obtener más información sobre ejercicios similares y continuar explorando nuevas soluciones, visita nuestra web.