hyper-scheduler 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +21 -0
- package/.eslintrc.cjs +26 -0
- package/GEMINI.md +1 -0
- package/README.md +38 -0
- package/docs/.vitepress/config.ts +52 -0
- package/docs/README.md +120 -0
- package/docs/api/devtools.md +232 -0
- package/docs/api/index.md +178 -0
- package/docs/api/scheduler.md +322 -0
- package/docs/api/task.md +439 -0
- package/docs/api/types.md +365 -0
- package/docs/examples/index.md +295 -0
- package/docs/guide/best-practices.md +436 -0
- package/docs/guide/core-concepts.md +363 -0
- package/docs/guide/getting-started.md +138 -0
- package/docs/index.md +33 -0
- package/docs/public/logo.svg +54 -0
- package/examples/browser/index.html +354 -0
- package/examples/node/simple.js +36 -0
- package/examples/react-demo/index.html +12 -0
- package/examples/react-demo/package.json +23 -0
- package/examples/react-demo/src/App.css +212 -0
- package/examples/react-demo/src/App.jsx +160 -0
- package/examples/react-demo/src/main.jsx +9 -0
- package/examples/react-demo/vite.config.ts +12 -0
- package/examples/react-demo/yarn.lock +752 -0
- package/examples/vue-demo/index.html +12 -0
- package/examples/vue-demo/package.json +21 -0
- package/examples/vue-demo/src/App.vue +373 -0
- package/examples/vue-demo/src/main.ts +4 -0
- package/examples/vue-demo/vite.config.ts +13 -0
- package/examples/vue-demo/yarn.lock +375 -0
- package/package.json +51 -0
- package/src/constants.ts +18 -0
- package/src/core/retry-strategy.ts +28 -0
- package/src/core/scheduler.ts +601 -0
- package/src/core/task-registry.ts +58 -0
- package/src/index.ts +74 -0
- package/src/platform/browser/browser-timer.ts +66 -0
- package/src/platform/browser/main-thread-timer.ts +16 -0
- package/src/platform/browser/worker.ts +31 -0
- package/src/platform/node/debug-cli.ts +19 -0
- package/src/platform/node/node-timer.ts +15 -0
- package/src/platform/timer-strategy.ts +19 -0
- package/src/plugins/dev-tools.ts +101 -0
- package/src/types.ts +115 -0
- package/src/ui/components/devtools.ts +525 -0
- package/src/ui/components/floating-trigger.ts +102 -0
- package/src/ui/components/icons.ts +16 -0
- package/src/ui/components/resizer.ts +129 -0
- package/src/ui/components/task-detail.ts +228 -0
- package/src/ui/components/task-header.ts +319 -0
- package/src/ui/components/task-list.ts +416 -0
- package/src/ui/components/timeline.ts +364 -0
- package/src/ui/debug-panel.ts +56 -0
- package/src/ui/i18n/en.ts +76 -0
- package/src/ui/i18n/index.ts +42 -0
- package/src/ui/i18n/zh.ts +76 -0
- package/src/ui/store/dev-tools-store.ts +191 -0
- package/src/ui/styles/theme.css.ts +56 -0
- package/src/ui/styles.ts +43 -0
- package/src/utils/cron-lite.ts +221 -0
- package/src/utils/cron.ts +20 -0
- package/src/utils/id.ts +10 -0
- package/src/utils/schedule.ts +93 -0
- package/src/vite-env.d.ts +1 -0
- package/stats.html +4949 -0
- package/tests/integration/Debug.test.ts +58 -0
- package/tests/unit/Plugin.test.ts +16 -0
- package/tests/unit/RetryStrategy.test.ts +21 -0
- package/tests/unit/Scheduler.test.ts +38 -0
- package/tests/unit/schedule.test.ts +70 -0
- package/tests/unit/ui/DevToolsStore.test.ts +67 -0
- package/tsconfig.json +28 -0
- package/vite.config.ts +51 -0
- package/vitest.config.ts +24 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# 核心概念
|
|
2
|
+
|
|
3
|
+
## 调度器 (Scheduler)
|
|
4
|
+
|
|
5
|
+
调度器是系统的核心控制器,负责:
|
|
6
|
+
|
|
7
|
+
- 任务注册与管理
|
|
8
|
+
- 时间循环维护
|
|
9
|
+
- 任务触发与执行
|
|
10
|
+
- 状态跟踪
|
|
11
|
+
|
|
12
|
+
### 生命周期
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
const scheduler = new Scheduler();
|
|
16
|
+
|
|
17
|
+
// 注册任务
|
|
18
|
+
scheduler.createTask({ ... });
|
|
19
|
+
|
|
20
|
+
// 启动调度
|
|
21
|
+
scheduler.start();
|
|
22
|
+
|
|
23
|
+
// 停止调度
|
|
24
|
+
scheduler.stop();
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 配置项
|
|
28
|
+
|
|
29
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
30
|
+
|------|------|--------|------|
|
|
31
|
+
| `debug` | `boolean` | `false` | 启用调试日志 |
|
|
32
|
+
| `timezone` | `string` | 系统时区 | 全局时区 |
|
|
33
|
+
| `maxHistory` | `number` | `50` | 历史记录上限 |
|
|
34
|
+
| `driver` | `'worker' \| 'main'` | `'worker'` | 定时器驱动方式(仅浏览器) |
|
|
35
|
+
|
|
36
|
+
### 定时器驱动方式
|
|
37
|
+
|
|
38
|
+
在浏览器环境中,Hyper Scheduler 支持两种定时器驱动方式:
|
|
39
|
+
|
|
40
|
+
**Worker 驱动(默认)**
|
|
41
|
+
|
|
42
|
+
使用 Web Worker 在后台线程运行定时器:
|
|
43
|
+
- ✅ 不受浏览器后台标签页节流限制
|
|
44
|
+
- ✅ 定时更精确
|
|
45
|
+
- ✅ 不阻塞主线程
|
|
46
|
+
|
|
47
|
+
**主线程驱动**
|
|
48
|
+
|
|
49
|
+
使用原生 `setTimeout` 在主线程运行定时器:
|
|
50
|
+
- ✅ 实现更简单
|
|
51
|
+
- ✅ 调试更方便
|
|
52
|
+
- ⚠️ 后台标签页可能受节流影响
|
|
53
|
+
|
|
54
|
+
#### 全局配置
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// 所有任务默认使用 Worker 驱动
|
|
58
|
+
const scheduler = new Scheduler({
|
|
59
|
+
driver: 'worker' // 默认值,可省略
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// 所有任务默认使用主线程驱动
|
|
63
|
+
const scheduler = new Scheduler({
|
|
64
|
+
driver: 'main'
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### 任务级配置
|
|
69
|
+
|
|
70
|
+
可以为单个任务指定不同的驱动方式,覆盖全局配置:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const scheduler = new Scheduler({ driver: 'worker' });
|
|
74
|
+
|
|
75
|
+
// 这个任务使用主线程驱动(覆盖全局配置)
|
|
76
|
+
scheduler.createTask({
|
|
77
|
+
id: 'simple-task',
|
|
78
|
+
schedule: '5s',
|
|
79
|
+
handler: () => console.log('Hello'),
|
|
80
|
+
options: {
|
|
81
|
+
driver: 'main'
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// 这个任务使用 Worker 驱动(继承全局配置)
|
|
86
|
+
scheduler.createTask({
|
|
87
|
+
id: 'precise-task',
|
|
88
|
+
schedule: '1s',
|
|
89
|
+
handler: () => console.log('Precise!')
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
> **注意**:Node.js 环境始终使用主线程 `setTimeout`,`driver` 配置无效。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 任务 (Task)
|
|
98
|
+
|
|
99
|
+
任务是调度的基本单元,包含三个核心要素:
|
|
100
|
+
|
|
101
|
+
### ID
|
|
102
|
+
|
|
103
|
+
任务的唯一标识符,用于查询、触发、停止等操作。
|
|
104
|
+
|
|
105
|
+
### Schedule
|
|
106
|
+
|
|
107
|
+
调度规则,支持两种格式:
|
|
108
|
+
|
|
109
|
+
**Cron 表达式**
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
秒 分 时 日 月 周
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
| 字段 | 取值范围 | 特殊字符 |
|
|
116
|
+
|------|----------|----------|
|
|
117
|
+
| 秒 | 0-59 | `*` `,` `-` `/` |
|
|
118
|
+
| 分 | 0-59 | `*` `,` `-` `/` |
|
|
119
|
+
| 时 | 0-23 | `*` `,` `-` `/` |
|
|
120
|
+
| 日 | 1-31 | `*` `,` `-` `/` |
|
|
121
|
+
| 月 | 1-12 | `*` `,` `-` `/` |
|
|
122
|
+
| 周 | 0-7 | `*` `,` `-` `/` |
|
|
123
|
+
|
|
124
|
+
特殊字符说明:
|
|
125
|
+
- `*` - 任意值
|
|
126
|
+
- `,` - 列举值,如 `1,3,5`
|
|
127
|
+
- `-` - 范围,如 `1-5`
|
|
128
|
+
- `/` - 步长,如 `*/5`
|
|
129
|
+
|
|
130
|
+
**时间间隔**
|
|
131
|
+
|
|
132
|
+
| 单位 | 示例 |
|
|
133
|
+
|------|------|
|
|
134
|
+
| `s` | `30s` - 每 30 秒 |
|
|
135
|
+
| `m` | `5m` - 每 5 分钟 |
|
|
136
|
+
| `h` | `2h` - 每 2 小时 |
|
|
137
|
+
| `d` | `1d` - 每天 |
|
|
138
|
+
|
|
139
|
+
### Handler
|
|
140
|
+
|
|
141
|
+
任务执行函数,支持同步和异步:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// 同步
|
|
145
|
+
handler: () => {
|
|
146
|
+
console.log('executed');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// 异步
|
|
150
|
+
handler: async () => {
|
|
151
|
+
await fetchData();
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 任务状态
|
|
158
|
+
|
|
159
|
+
| 状态 | 说明 |
|
|
160
|
+
|------|------|
|
|
161
|
+
| `stopped` | 已停止,不参与调度 |
|
|
162
|
+
| `idle` | 等待调度,将在下次触发时间执行 |
|
|
163
|
+
| `running` | 正在执行 |
|
|
164
|
+
| `error` | 执行出错 |
|
|
165
|
+
|
|
166
|
+
状态流转:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
stopped -> idle -> running -> idle
|
|
170
|
+
|
|
|
171
|
+
v
|
|
172
|
+
error -> idle (重试) 或 error (放弃)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 任务选项
|
|
178
|
+
|
|
179
|
+
### 重试配置
|
|
180
|
+
|
|
181
|
+
任务执行失败时可自动重试:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
scheduler.createTask({
|
|
185
|
+
id: 'api-call',
|
|
186
|
+
schedule: '1m',
|
|
187
|
+
handler: async () => {
|
|
188
|
+
await callAPI();
|
|
189
|
+
},
|
|
190
|
+
options: {
|
|
191
|
+
retry: {
|
|
192
|
+
maxAttempts: 3, // 最大重试次数
|
|
193
|
+
initialDelay: 1000, // 首次重试延迟 (ms)
|
|
194
|
+
factor: 2 // 延迟递增因子
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
重试延迟计算:`initialDelay * (factor ^ attempt)`
|
|
201
|
+
|
|
202
|
+
示例(initialDelay=1000, factor=2):
|
|
203
|
+
- 第 1 次重试:1000ms
|
|
204
|
+
- 第 2 次重试:2000ms
|
|
205
|
+
- 第 3 次重试:4000ms
|
|
206
|
+
|
|
207
|
+
### 错误处理
|
|
208
|
+
|
|
209
|
+
通过 `onError` 回调处理任务执行错误:
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
scheduler.createTask({
|
|
213
|
+
id: 'critical-task',
|
|
214
|
+
schedule: '30s',
|
|
215
|
+
handler: async () => {
|
|
216
|
+
await criticalOperation();
|
|
217
|
+
},
|
|
218
|
+
options: {
|
|
219
|
+
onError: (error, taskId) => {
|
|
220
|
+
// 记录错误日志
|
|
221
|
+
logger.error(`Task ${taskId} failed:`, error);
|
|
222
|
+
// 发送告警
|
|
223
|
+
alertService.send({
|
|
224
|
+
title: 'Task Failed',
|
|
225
|
+
message: error.message,
|
|
226
|
+
taskId
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 时区配置
|
|
234
|
+
|
|
235
|
+
为任务指定专属时区:
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
scheduler.createTask({
|
|
239
|
+
id: 'tokyo-report',
|
|
240
|
+
schedule: '0 0 9 * * *', // 每天 9:00
|
|
241
|
+
handler: () => generateReport(),
|
|
242
|
+
options: {
|
|
243
|
+
timezone: 'Asia/Tokyo'
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 计时策略
|
|
251
|
+
|
|
252
|
+
调度器根据运行环境自动选择计时策略:
|
|
253
|
+
|
|
254
|
+
### Node.js
|
|
255
|
+
|
|
256
|
+
使用 `setTimeout` + `process.hrtime` 实现高精度计时。
|
|
257
|
+
|
|
258
|
+
### 浏览器
|
|
259
|
+
|
|
260
|
+
优先使用 Web Worker 运行计时循环,避免后台标签页节流问题。
|
|
261
|
+
|
|
262
|
+
浏览器在标签页切换到后台时会限制 `setTimeout` 最小间隔为 1 秒,Web Worker 不受此限制。
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 任务标签
|
|
267
|
+
|
|
268
|
+
标签用于任务分类和过滤:
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
scheduler.createTask({
|
|
272
|
+
id: 'sync-orders',
|
|
273
|
+
schedule: '1m',
|
|
274
|
+
tags: ['sync', 'orders', 'critical'],
|
|
275
|
+
handler: async () => {
|
|
276
|
+
await syncOrders();
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
在 DevTools 中可按标签搜索过滤任务。
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## 执行历史
|
|
286
|
+
|
|
287
|
+
每个任务记录最近的执行历史:
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
interface ExecutionRecord {
|
|
291
|
+
timestamp: number; // 执行时间戳
|
|
292
|
+
duration: number; // 执行耗时 (ms)
|
|
293
|
+
success: boolean; // 是否成功
|
|
294
|
+
error?: string; // 错误信息
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
通过 `maxHistory` 配置控制保留数量,默认 50 条。
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 事件系统
|
|
303
|
+
|
|
304
|
+
调度器支持事件订阅:
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
// 订阅
|
|
308
|
+
const unsubscribe = scheduler.on('task_completed', (payload) => {
|
|
309
|
+
console.log(`${payload.taskId} completed`);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// 取消订阅
|
|
313
|
+
unsubscribe();
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
| 事件 | 触发时机 |
|
|
317
|
+
|------|----------|
|
|
318
|
+
| `task_registered` | 任务注册 |
|
|
319
|
+
| `task_started` | 开始执行 |
|
|
320
|
+
| `task_completed` | 执行成功 |
|
|
321
|
+
| `task_failed` | 执行失败 |
|
|
322
|
+
| `task_stopped` | 任务停止 |
|
|
323
|
+
| `task_removed` | 任务删除 |
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## DevTools
|
|
328
|
+
|
|
329
|
+
浏览器环境下的可视化调试工具。
|
|
330
|
+
|
|
331
|
+
### 配置项
|
|
332
|
+
|
|
333
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
334
|
+
|------|------|--------|------|
|
|
335
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | 主题模式 |
|
|
336
|
+
| `dockPosition` | `'right' \| 'bottom'` | `'right'` | 面板停靠位置 |
|
|
337
|
+
| `language` | `'en' \| 'zh'` | `'en'` | 界面语言 |
|
|
338
|
+
| `defaultZoom` | `number` | `1` | 时间线缩放级别 (0.5-5) |
|
|
339
|
+
| `trigger.backgroundColor` | `string` | `'#3b82f6'` | 悬浮按钮背景色 |
|
|
340
|
+
| `trigger.textColor` | `string` | `'#ffffff'` | 悬浮按钮文字颜色 |
|
|
341
|
+
| `trigger.position` | `string` | `'bottom-right'` | 悬浮按钮位置 |
|
|
342
|
+
|
|
343
|
+
### 示例
|
|
344
|
+
|
|
345
|
+
```typescript
|
|
346
|
+
import { Scheduler, DevTools } from 'hyper-scheduler';
|
|
347
|
+
|
|
348
|
+
const scheduler = new Scheduler({
|
|
349
|
+
plugins: [
|
|
350
|
+
new DevTools({
|
|
351
|
+
theme: 'dark',
|
|
352
|
+
language: 'zh',
|
|
353
|
+
dockPosition: 'bottom',
|
|
354
|
+
defaultZoom: 2,
|
|
355
|
+
trigger: {
|
|
356
|
+
backgroundColor: '#10b981',
|
|
357
|
+
textColor: '#ffffff',
|
|
358
|
+
position: 'bottom-left'
|
|
359
|
+
}
|
|
360
|
+
})
|
|
361
|
+
]
|
|
362
|
+
});
|
|
363
|
+
```
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# 快速开始
|
|
2
|
+
|
|
3
|
+
## 安装
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install hyper-scheduler
|
|
7
|
+
# 或
|
|
8
|
+
pnpm add hyper-scheduler
|
|
9
|
+
# 或
|
|
10
|
+
yarn add hyper-scheduler
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 基础用法
|
|
14
|
+
|
|
15
|
+
### 1. 创建调度器
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { Scheduler } from 'hyper-scheduler';
|
|
19
|
+
|
|
20
|
+
const scheduler = new Scheduler({
|
|
21
|
+
debug: true, // 开启调试日志
|
|
22
|
+
maxHistory: 100 // 保留最近 100 条执行记录
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. 注册任务
|
|
27
|
+
|
|
28
|
+
支持两种调度规则:Cron 表达式和时间间隔。
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// Cron 表达式:每分钟执行
|
|
32
|
+
scheduler.createTask({
|
|
33
|
+
id: 'cron-task',
|
|
34
|
+
schedule: '0 * * * * *',
|
|
35
|
+
handler: () => {
|
|
36
|
+
console.log('Cron task executed');
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// 时间间隔:每 5 秒执行
|
|
41
|
+
scheduler.createTask({
|
|
42
|
+
id: 'interval-task',
|
|
43
|
+
schedule: '5s',
|
|
44
|
+
handler: () => {
|
|
45
|
+
console.log('Interval task executed');
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 3. 启动调度器
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
scheduler.start();
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 完整示例
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { Scheduler } from 'hyper-scheduler';
|
|
60
|
+
|
|
61
|
+
const scheduler = new Scheduler({ debug: true });
|
|
62
|
+
|
|
63
|
+
// Cron 任务:每 3 秒
|
|
64
|
+
scheduler.createTask({
|
|
65
|
+
id: 'cron-task',
|
|
66
|
+
schedule: '*/3 * * * * *',
|
|
67
|
+
handler: () => console.log('Cron task executed')
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// 间隔任务:每 5 秒
|
|
71
|
+
scheduler.createTask({
|
|
72
|
+
id: 'interval-task',
|
|
73
|
+
schedule: '5s',
|
|
74
|
+
handler: () => console.log('Interval task executed')
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// 启动调度器
|
|
78
|
+
scheduler.start();
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 浏览器环境
|
|
82
|
+
|
|
83
|
+
在浏览器中可以启用可视化调试工具,通过在 Scheduler 构造函数中传入 DevTools 插件实现:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { Scheduler, DevTools } from 'hyper-scheduler';
|
|
87
|
+
|
|
88
|
+
const scheduler = new Scheduler({
|
|
89
|
+
debug: true,
|
|
90
|
+
plugins: [
|
|
91
|
+
new DevTools({
|
|
92
|
+
theme: 'auto',
|
|
93
|
+
dockPosition: 'right',
|
|
94
|
+
language: 'zh',
|
|
95
|
+
defaultZoom: 1,
|
|
96
|
+
trigger: {
|
|
97
|
+
backgroundColor: '#3b82f6',
|
|
98
|
+
textColor: '#ffffff',
|
|
99
|
+
position: 'bottom-right'
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// 注册任务...
|
|
106
|
+
|
|
107
|
+
scheduler.start();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 调度规则
|
|
111
|
+
|
|
112
|
+
### Cron 表达式
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
秒 分 时 日 月 周
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
| 示例 | 说明 |
|
|
119
|
+
|------|------|
|
|
120
|
+
| `0 * * * * *` | 每分钟 |
|
|
121
|
+
| `*/5 * * * * *` | 每 5 秒 |
|
|
122
|
+
| `0 0 * * * *` | 每小时 |
|
|
123
|
+
| `0 0 2 * * *` | 每天凌晨 2:00 |
|
|
124
|
+
| `0 0 9 * * 1` | 每周一 9:00 |
|
|
125
|
+
|
|
126
|
+
### 时间间隔
|
|
127
|
+
|
|
128
|
+
| 格式 | 说明 |
|
|
129
|
+
|------|------|
|
|
130
|
+
| `30s` | 每 30 秒 |
|
|
131
|
+
| `5m` | 每 5 分钟 |
|
|
132
|
+
| `2h` | 每 2 小时 |
|
|
133
|
+
| `1d` | 每天 |
|
|
134
|
+
|
|
135
|
+
## 下一步
|
|
136
|
+
|
|
137
|
+
- [核心概念](./core-concepts.md) - 深入理解调度机制
|
|
138
|
+
- [API 文档](../api/scheduler.md) - 完整 API 参考
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: home
|
|
3
|
+
|
|
4
|
+
hero:
|
|
5
|
+
name: Hyper Scheduler
|
|
6
|
+
text: 轻量级、高性能的全局任务调度 JS 库
|
|
7
|
+
image:
|
|
8
|
+
src: /logo.svg
|
|
9
|
+
alt: Hyper Scheduler Logo
|
|
10
|
+
tagline: 支持 Cron 表达式与人性化时间间隔,浏览器与 Node.js 通用
|
|
11
|
+
actions:
|
|
12
|
+
- theme: brand
|
|
13
|
+
text: 快速开始
|
|
14
|
+
link: /guide/getting-started
|
|
15
|
+
- theme: alt
|
|
16
|
+
text: 核心概念
|
|
17
|
+
link: /guide/core-concepts
|
|
18
|
+
|
|
19
|
+
features:
|
|
20
|
+
- title: 灵活调度
|
|
21
|
+
details: 同时支持标准的 Cron 表达式(如 `*/5 * * * *`)和人性化的时间间隔字符串(如 `10s`, `1h`)。
|
|
22
|
+
- title: 跨平台
|
|
23
|
+
details: 支持浏览器和 Node.js 环境,一份代码,多端运行。浏览器端自动使用 Web Worker 防止阻塞。
|
|
24
|
+
- title: 精准计时
|
|
25
|
+
details: 浏览器端通过 Web Worker 确保后台任务精准执行,即使在页面标签页后台运行时也能避免节流限制。
|
|
26
|
+
- title: 开发友好
|
|
27
|
+
details: API 设计简洁直观。内置调试工具,支持日志追踪和可视化调试(WIP)。
|
|
28
|
+
- title: 轻量级
|
|
29
|
+
details: 核心库体积小巧,模块化设计,支持 Tree-shaking。
|
|
30
|
+
- title: TypeScript
|
|
31
|
+
details: 完全使用 TypeScript 编写,提供完整的类型定义,开发体验极佳。
|
|
32
|
+
|
|
33
|
+
footer: MIT Licensed | Copyright © 2025-present Hyper Scheduler Contributors
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="none">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="main" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#6366f1"/>
|
|
5
|
+
<stop offset="100%" style="stop-color:#a855f7"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="bolt" x1="50%" y1="0%" x2="50%" y2="100%">
|
|
8
|
+
<stop offset="0%" style="stop-color:#fcd34d"/>
|
|
9
|
+
<stop offset="100%" style="stop-color:#f59e0b"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow">
|
|
12
|
+
<feGaussianBlur stdDeviation="2" result="blur"/>
|
|
13
|
+
<feMerge>
|
|
14
|
+
<feMergeNode in="blur"/>
|
|
15
|
+
<feMergeNode in="SourceGraphic"/>
|
|
16
|
+
</feMerge>
|
|
17
|
+
</filter>
|
|
18
|
+
<filter id="softShadow">
|
|
19
|
+
<feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#6366f1" flood-opacity="0.3"/>
|
|
20
|
+
</filter>
|
|
21
|
+
</defs>
|
|
22
|
+
|
|
23
|
+
<!-- 背景圆 - 柔和填充 -->
|
|
24
|
+
<circle cx="64" cy="64" r="56" fill="url(#main)" opacity="0.1"/>
|
|
25
|
+
|
|
26
|
+
<!-- 刻度点 - 简约时钟感 -->
|
|
27
|
+
<g fill="url(#main)" opacity="0.7">
|
|
28
|
+
<circle cx="64" cy="16" r="4"/>
|
|
29
|
+
<circle cx="112" cy="64" r="4"/>
|
|
30
|
+
<circle cx="64" cy="112" r="4"/>
|
|
31
|
+
<circle cx="16" cy="64" r="4"/>
|
|
32
|
+
</g>
|
|
33
|
+
|
|
34
|
+
<!-- 次要刻度 -->
|
|
35
|
+
<g fill="url(#main)" opacity="0.35">
|
|
36
|
+
<circle cx="98" cy="26" r="2.5"/>
|
|
37
|
+
<circle cx="102" cy="98" r="2.5"/>
|
|
38
|
+
<circle cx="26" cy="98" r="2.5"/>
|
|
39
|
+
<circle cx="30" cy="26" r="2.5"/>
|
|
40
|
+
</g>
|
|
41
|
+
|
|
42
|
+
<!-- 闪电 - 核心元素 -->
|
|
43
|
+
<path d="M72 20 L44 68 L62 68 L52 108 L88 52 L68 52 L72 20Z"
|
|
44
|
+
fill="url(#bolt)"
|
|
45
|
+
filter="url(#glow)"/>
|
|
46
|
+
|
|
47
|
+
<!-- 闪电高光 -->
|
|
48
|
+
<path d="M70 26 L50 64 L62 64 L56 92"
|
|
49
|
+
stroke="#fff"
|
|
50
|
+
stroke-width="2"
|
|
51
|
+
stroke-linecap="round"
|
|
52
|
+
fill="none"
|
|
53
|
+
opacity="0.4"/>
|
|
54
|
+
</svg>
|