Planificador de tareas en TypeScript: guía completa
Un planificador de tareas (task scheduler) es una herramienta que permite ejecutar funciones o scripts en un momento determinado o con una periodicidad específica. En el ecosistema de TypeScript existen varias bibliotecas maduras para implementar estos escenarios: desde temporizadores simples hasta potentes sistemas cron. En este artículo analizaremos los enfoques principales y mostraremos cómo utilizarlos en proyectos reales.
¿Para qué sirve un planificador de tareas?
La automatización de acciones repetitivas es una tarea clave en cualquier aplicación de servidor. Escenarios típicos:
- Envío de notificaciones por correo electrónico cada hora.
- Limpieza de archivos temporales cada noche.
- Recopilación de análisis al final del día.
- Actualización de caché según un horario.
En TypeScript (y JavaScript) existe un mecanismo básico incorporado: setInterval y setTimeout, pero para horarios complejos es más conveniente utilizar bibliotecas especializadas.
Herramientas integradas: setInterval y setTimeout
La forma más sencilla es usar funciones globales:
// Ejemplo: ejecutar cada 5 segundosconst intervalId = setInterval(() => { console.log('Tarea ejecutada a las', new Date().toISOString());}, 5000);
// Detener después de 30 segundossetTimeout(() => { clearInterval(intervalId); console.log('Planificador detenido');}, 30000);Ventajas: no requiere instalación, funciona en cualquier entorno. Desventajas: no admite expresiones cron, es difícil gestionar tareas omitidas.
Biblioteca node-cron
Una de las bibliotecas más populares para Node.js. Funciona con el formato cron clásico (5 campos): minutos, horas, día del mes, mes, día de la semana.
Instalación
npm install node-cronnpm install @types/node-cronEjemplo de uso
import * as cron from 'node-cron';
// Tarea: cada minutocron.schedule('* * * * *', () => { console.log('Ejecución cada minuto');});
// Tarea: cada día a las 9:30 a.m.cron.schedule('30 9 * * *', () => { console.log('Tarea diaria a las 9:30');});
// Tarea: entre semana a las 18:00cron.schedule('0 18 * * 1-5', () => { console.log('Entre semana a las 18:00');});Gestión de tareas
import * as cron from 'node-cron';
const task = cron.schedule('*/5 * * * *', () => { console.log('Cada 5 minutos');});
// Detener la tareatask.stop();
// Reanudartask.start();
// Verificar estadoconsole.log(task.isActive()); // true o falseBiblioteca croner
Una alternativa más moderna, escrita desde cero en TypeScript. Admite sintaxis extendida (segundos, nombres de meses) y funciona tanto en Node.js como en el navegador.
Instalación
npm install cronerEjemplo con segundos
import Cron from 'croner';
// Cada 10 segundosconst job = new Cron('*/10 * * * * *', () => { console.log('Ejecución cada 10 segundos');});
// Tarea: cada lunes a las 8:30 a.m.const weeklyJob = new Cron('30 8 * * 1', () => { console.log('Lunes, 8:30');});
// Detener después de 1 minutosetTimeout(() => { job.stop(); console.log('Tarea detenida');}, 60000);Funcionalidades avanzadas
import Cron from 'croner';
// Tarea con nombre y zona horariaconst job = new Cron('0 9 * * *', { name: 'morning-report', timezone: 'Europe/Moscow'}, () => { console.log('Informe matutino de Moscú');});
// Obtener la próxima hora de ejecuciónconst nextRun = job.nextRun();console.log('Próxima ejecución:', nextRun.toISOString());
// Lista de todas las tareas activasconst activeJobs = Cron.getJobs();console.log('Tareas activas:', activeJobs.length);Comparación entre node-cron y croner
- node-cron — una biblioteca probada por el tiempo
También en la biblioteca
Registro en JavaScript (Node.js): las mejores soluciones para tu proyecto
Twig para PHP: guía completa con ejemplos prácticos
CameraX para Kotlin: guía completa con ejemplos prácticos