本文档描述了 Nodemon 的事件驱动架构,该架构实现了组件间的内部通信,并为外部使用者提供了编程 API。事件系统是 Nodemon 运行的核心,它有助于子进程的监控、重启和管理。有关配置系统的信息,请参阅配置系统。有关文件监控实现的详细信息,请参阅文件监控系统。
Nodemon 使用集中式事件总线来解耦各个组件,使它们能够在没有直接依赖的情况下进行通信。事件总线充当一个中介,组件可以通过它发布事件和订阅事件。
来源: lib/monitor/run.js4 lib/monitor/run.js175 lib/monitor/run.js236 lib/monitor/run.js251 lib/monitor/run.js534
Nodemon 的事件主要分为三类
命令是触发 Nodemon 中特定操作的事件。
| 事件 | 描述 | 来源 |
|---|---|---|
| restart | 触发子进程重启 | lib/monitor/run.js534-538 |
| config:update | 指示配置已更新 | doc/events.md |
| quit | 终止 Nodemon 及其子进程 | lib/monitor/run.js490-532 |
状态事件表示子进程的生命周期状态。
| 事件 | 描述 | 来源 |
|---|---|---|
| start | 子进程已启动 | lib/monitor/run.js175 |
| crash | 子进程已崩溃(异常终止) | lib/monitor/run.js251 |
| exit | 子进程已干净退出 | lib/monitor/run.js236 |
| restart | 子进程已重启(包含已更改文件的数组) | lib/monitor/run.js534-538 |
消息事件提供 I/O 流和日志信息。
| 事件 | 描述 | 来源 |
|---|---|---|
| log | 来自 Nodemon 的日志消息 | doc/events.md |
| stdout | 来自子进程的标准输出流 | lib/monitor/run.js150 |
| stderr | 来自子进程的标准错误流 | lib/monitor/run.js153 |
| readable | 指示 stdout 和 stderr 流已就绪 | doc/events.md |
| error | 错误信息 | lib/monitor/run.js180 |
| message | 用于与子进程进行 IPC 通信 | lib/monitor/run.js170 |
来源: doc/events.md5-24 lib/monitor/run.js150-155 lib/monitor/run.js170-172 lib/monitor/run.js180
下图展示了 Nodemon 中典型进程生命周期中的事件流
来源: lib/monitor/run.js175-176 lib/monitor/run.js190-270 lib/monitor/run.js440-486 lib/monitor/run.js534-538
此图显示了文件更改触发重启时的事件流
来源: lib/monitor/run.js534-538 lib/monitor/run.js440-486 lib/monitor/run.js22-320
Nodemon 使用集中式事件总线,存储在 utils.bus 中,用于管理整个应用程序的事件。事件总线是 Node.js EventEmitter 的一个实例,允许组件发出和监听事件。
以下代码位置是系统中事件的主要来源
进程启动
进程崩溃
进程退出
标准输出/错误
重启
来源: lib/monitor/run.js175 lib/monitor/run.js236 lib/monitor/run.js251 lib/monitor/run.js150-153 lib/monitor/run.js534-538
Nodemon 的事件系统主要有两种使用方式:作为 Node.js 应用程序中的必需模块或作为子进程。
当 Nodemon 作为模块被引入时,你可以直接绑定事件监听器并触发事件
当 Nodemon 作为子进程运行时,通信通过 Node.js IPC 消息进行
Nodemon 提供了选项来控制父进程和子进程之间 stdin 和 stdout 的处理方式。默认情况下,stdin 和 stdout/stderr 会在进程之间进行管道传输,但此行为可以自定义
来源: lib/monitor/run.js51-59 lib/monitor/run.js147-167 lib/monitor/run.js283-314
监听关键事件:始终监听 crash 和 exit 事件,以正确处理应用程序终止。
管理输出:以编程方式使用 Nodemon 时,请决定是直接处理 stdout/stderr,还是让 Nodemon 将其管道传输到父进程。
事件流理解:理解事件流(restart → kill → exit → start)有助于编写健壮的事件处理程序。
干净终止:使用 quit 事件,以确保所有资源和子进程的正确清理。
子进程的 IPC:当 Nodemon 作为子进程使用时,始终在 stdio 选项中包含 IPC 通道,以实现正确的事件通信。