Nodejs中的Cron库
2023-10-12 09:42:56 阿炯

计划任务是现代业务系统中一项目比较重要的后台任务管理程序,Unix/Linux或Windows均有操作系统层的提供,开源界有非常有名的 Vixie-cron 模式。但在一些开发框架中提供了类似于操作系统的任务管理接口,Node.js更是提供了多种实现方案。

在下面的比较中概述了Croner与其他四个流行的调度库之间的关键差异:cronosjs、node-cron、cron和nodeschedule。这些库在各种功能上进行了比较,如平台兼容性、功能、错误处理和Typescript支持。下表简要概述了每个库的功能:
 cronercronosjsnode-croncronnode-schedule
Platforms     
Node.js (CommonJS)
Browser (ESMCommonJS)   
Deno (ESM)    
Features     
Over-run protection    
Error handling   
Typescript typings  
Unref timers (optional)   
dom-OR-dow*
dom-AND-dow* (optional)    
Next run 
Next n runs  
Timezone
Minimum interval    
Controls (stop/resume)
Range (0-13)
Stepping (*/5)
Last day of month (L)   
Nth weekday of month (#)   


Croner

其用于在 JavaScript 或 TypeScript 中触发函数或计算 cron 表达式。Croner 没有任何外部依赖,支持 Node、 Deno、Bun、Browser 等所有主流环境,采用MIT协议授权。


Trigger functions or evaluate cron expressions in JavaScript or TypeScript. No dependencies. All features. Node. Deno. Bun. Browser.

目前 Croner 在 Github 上是一个值得关注的前端开源项目。其具有以下特点:
使用 cron 语法在 JavaScript 中触发函数。
执行 cron 表达式并获取即将到来的运行时间的列表。
使用 Vixie-cron 模式,并具有附加功能,例如 L 表示该月的最后一天和工作日,# 表示该月的第 n 个工作日。
适用于 Node.js >=7.6(需要和导入)、Deno >=1.16 和 Bun >=0.2.2。
在浏览器中作为独立、UMD 或 ES 模块工作。
支持不同的时区、内置超限保护、内置错误处理、支持 TypeScript 类型。
支持异步函数、计划任务后暂停、恢复或停止执行。
在内存中运行,无需数据库或配置文件,同时具有零外部依赖。

有关安装和使用的完整文档可在此处找到。Croner 允许开发者使用最喜欢的包管理器或 CDN 安装 croner,然后将其包含在项目中:

使用 Node.js 或 Bun:
// ESM Import ...import { Cron } from 'croner';// ... or CommonJS Require, destructure to add type hintsconst { Cron } = require('croner');

在 Deno 环境中可以如下使用:
import { Cron } from 'https://deno.land/x/croner@6.0.3/dist/croner.js';

或者通过 UMD 模式在浏览器中使用:

下面是使用 Croner 的简单示例:

// 基础用法:按照 cron 表达式定义的时间间隔运行函数const job = Cron('*/5 * * * * *', () => {console.log('This will run every fifth second');

// 枚举:接下来的 100 个星期日是哪一天?const nextSundays = Cron('0 0 0 * * 7').nextRuns(100);console.log(nextSundays);

// 距特定日期还剩多少天const msLeft = Cron('59 59 23 24 DEC *').nextRun() - new Date();console.log(Math.floor(msLeft/1000/3600/24) + ' days left to next christmas eve'

// 使用非本地时区在特定日期/时间运行函数(时间为 ISO 8601 本地时间)

// 将根据Asia/Kolkata的时间在 2024-01-23 00:00:00 运行Cron('2024-01-23T00:00:00', { timezone: 'Asia/Kolkata' }, () => {console.log('Yay!');