菜单

事件系统

相关源文件

目的与范围

本文档描述了 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 的事件主要分为三类

1. 命令

命令是触发 Nodemon 中特定操作的事件。

事件描述来源
restart触发子进程重启lib/monitor/run.js534-538
config:update指示配置已更新doc/events.md
quit终止 Nodemon 及其子进程lib/monitor/run.js490-532

2. 状态

状态事件表示子进程的生命周期状态。

事件描述来源
start子进程已启动lib/monitor/run.js175
crash子进程已崩溃(异常终止)lib/monitor/run.js251
exit子进程已干净退出lib/monitor/run.js236
restart子进程已重启(包含已更改文件的数组)lib/monitor/run.js534-538

3. 消息

消息事件提供 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 的一个实例,允许组件发出和监听事件。

关键事件发射器

以下代码位置是系统中事件的主要来源

  1. 进程启动

  2. 进程崩溃

  3. 进程退出

  4. 标准输出/错误

  5. 重启

来源: 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 消息进行

来源: doc/events.md31-97

标准输入/输出处理

Nodemon 提供了选项来控制父进程和子进程之间 stdin 和 stdout 的处理方式。默认情况下,stdin 和 stdout/stderr 会在进程之间进行管道传输,但此行为可以自定义

来源: lib/monitor/run.js51-59 lib/monitor/run.js147-167 lib/monitor/run.js283-314

事件系统最佳实践

  1. 监听关键事件:始终监听 crashexit 事件,以正确处理应用程序终止。

  2. 管理输出:以编程方式使用 Nodemon 时,请决定是直接处理 stdout/stderr,还是让 Nodemon 将其管道传输到父进程。

  3. 事件流理解:理解事件流(restart → kill → exit → start)有助于编写健壮的事件处理程序。

  4. 干净终止:使用 quit 事件,以确保所有资源和子进程的正确清理。

  5. 子进程的 IPC:当 Nodemon 作为子进程使用时,始终在 stdio 选项中包含 IPC 通道,以实现正确的事件通信。

来源: doc/events.md31-97 lib/monitor/run.js490-532