Планировщик задач на TypeScript: полное руководство по cron-библиотекам и таймерам

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач на 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, поддерживает секунды, именованные задачи, временные зоны и работает в браузере.

Рекомендаций