Планировщик задач на TypeScript: полное руководство
Планировщик задач (task scheduler) — это инструмент, позволяющий запускать функции или скрипты в определённое время или с заданной периодичностью. В экосистеме TypeScript существует несколько зрелых библиотек для реализации таких сценариев: от простых таймеров до мощных cron-систем. В этой статье мы разберём основные подходы и покажем, как использовать их в реальных проектах.
Зачем нужен планировщик задач?
Автоматизация повторяющихся действий — ключевая задача любого серверного приложения. Типичные сценарии:
- Отправка email-уведомлений раз в час.
- Очистка временных файлов каждую ночь.
- Сбор аналитики в конце дня.
- Обновление кэша по расписанию.
В TypeScript (и JavaScript) встроен базовый механизм — setInterval и setTimeout, но для сложных расписаний удобнее использовать специализированные библиотеки.
Встроенные средства: setInterval и setTimeout
Самый простой способ — использовать глобальные функции:
// Пример: выполнять каждые 5 секунд
const intervalId = setInterval(() => {
console.log('Задача выполнена в', new Date().toISOString());
}, 5000);
// Остановка через 30 секунд
setTimeout(() => {
clearInterval(intervalId);
console.log('Планировщик остановлен');
}, 30000);
Плюсы: не требует установки, работает в любом окружении. Минусы: нет поддержки cron-выражений, сложно управлять пропущенными задачами.
Библиотека node-cron
Одна из самых популярных библиотек для Node.js. Работает с классическим cron-форматом (5 полей): минуты, часы, день месяца, месяц, день недели.
Установка
npm install node-cron
npm install @types/node-cron
Пример использования
import * as cron from 'node-cron';
// Задача: каждую минуту
cron.schedule('* * * * *', () => {
console.log('Запуск каждую минуту');
});
// Задача: каждый день в 9:30 утра
cron.schedule('30 9 * * *', () => {
console.log('Ежедневная задача в 9:30');
});
// Задача: по будням в 18:00
cron.schedule('0 18 * * 1-5', () => {
console.log('По будням в 18:00');
});
Управление задачами
import * as cron from 'node-cron';
const task = cron.schedule('*/5 * * * *', () => {
console.log('Каждые 5 минут');
});
// Остановить задачу
task.stop();
// Возобновить
task.start();
// Проверить статус
console.log(task.isActive()); // true или false
Библиотека croner
Более современная альтернатива, написанная на TypeScript с нуля. Поддерживает расширенный синтаксис (секунды, названия месяцев) и работает как в Node.js, так и в браузере.
Установка
npm install croner
Пример с секундами
import Cron from 'croner';
// Каждые 10 секунд
const job = new Cron('*/10 * * * * *', () => {
console.log('Запуск каждые 10 секунд');
});
// Задача: каждый понедельник в 8:30 утра
const weeklyJob = new Cron('30 8 * * 1', () => {
console.log('Понедельник, 8:30');
});
// Остановка через 1 минуту
setTimeout(() => {
job.stop();
console.log('Задача остановлена');
}, 60000);
Расширенные возможности
import Cron from 'croner';
// Задача с именем и временной зоной
const job = new Cron('0 9 * * *', {
name: 'morning-report',
timezone: 'Europe/Moscow'
}, () => {
console.log('Утренний отчёт по Москве');
});
// Получить следующее время выполнения
const nextRun = job.nextRun();
console.log('Следующий запуск:', nextRun.toISOString());
// Список всех активных задач
const activeJobs = Cron.getJobs();
console.log('Активные задачи:', activeJobs.length);
Сравнение node-cron и croner
- node-cron — проверенная временем библиотека, простая в освоении, но ограниченная 5 полями и без поддержки секунд.
- croner — современная, полностью на TypeScript, поддерживает секунды, именованные задачи, временные зоны и работает в браузере.