process.stdout 和 process.stderr 与其他 Node.js 流有重大不同:
- 它们分别被用于 [
console.log()] 和 [console.error()] 内部。 - 写操作是否为同步,取决于连接到的流以及操作系统是 Windows 还是 POSIX:
- 文件:在 Windows 和 POSIX 上都是同步的。
- TTY(终端):在 Windows 上是异步的,在 POSIX 上是同步的。
- 管道(以及 socket):在 Windows 上是同步的,在 POSIX 上是异步的。
这些行为部分是历史原因,改变它们可能导致向后不兼容,而且它们的行为也符合部分用户的期望。
同步的写操作可以避免一些问题,比如 console.log() 或 console.error() 写入的输出被不符合预期地交错,或者在异步的写入完成前调用了 process.exit() 导致根本没写入。
详见 [process.exit()]。
注意,同步的写入会阻塞事件循环直到写入完成。 在输出到文件的情况下,这可能几乎是瞬时的,但当系统处于高负载时,管道的接收端不被读取,或者终端或文件系统速度缓慢,这可能使事件循环经常被长时间阻塞,从而对性能产生严重的负面影响。 当写入到交互的终端会话时,这可能不是个问题,但当写入生产日志到进程的输出流时,则要特别留心。
如果要检查一个流是否连接到了 [TTY] 上下文, 则检查 isTTY 属性。
例如:
$ node -p "Boolean(process.stdin.isTTY)"true$ echo "foo" | node -p "Boolean(process.stdin.isTTY)"false$ node -p "Boolean(process.stdout.isTTY)"true$ node -p "Boolean(process.stdout.isTTY)" | catfalse
详见 [TTY] 文档。
