官方文档参考:nodejs.org/docs/v22.14…
1. 'pipe'
-
作用:在父进程和子进程之间创建一个管道(pipe)。父进程可以通过
child_process.spawn()返回的ChildProcess对象的stdin、stdout和stderr流与子进程通信。 -
示例:
javascript
复制
const { spawn } = require('child_process'); const child = spawn('ls', ['-l'], { stdio: 'pipe' }); child.stdout.on('data', (data) => { console.log(`输出:${data}`); }); -
使用场景:
- 需要从子进程读取输出(如日志或命令结果)。
- 需要向子进程发送输入(如交互式命令或数据传输)。
- 默认值(如果不显式指定
stdio,则stdio: 'pipe')。
2. 'overlapped' (仅 Windows)
-
作用:类似于
'pipe',但在 Windows 上专门用于解决异步 I/O 问题(如避免阻塞)。仅对stdout和stderr有效。 -
注意:
- 仅在 Windows 上有意义,其他平台会忽略。
- Node.js 文档中较少提及,通常直接使用
'pipe'即可。
-
使用场景:
- 在 Windows 上需要异步处理子进程的输出时。
3. 'ignore'
-
作用:完全忽略子进程的对应流。父进程无法通过管道通信,子进程的输入/输出会被丢弃。
-
示例:
javascript
复制
const { spawn } = require('child_process'); const child = spawn('ls', ['-l'], { stdio: ['ignore', 'ignore', process.stderr] }); -
使用场景:
- 不需要子进程的输出(如后台任务)。
- 不需要向子进程发送输入(如仅触发任务)。
- 显式忽略错误流外的输出(如仅需记录错误)。
4. 'inherit'
-
作用:子进程的输入/输出直接继承自父进程。子进程的
stdin、stdout、stderr会直接绑定到父进程的对应流。 -
示例:
javascript
复制
const { spawn } = require('child_process'); const child = spawn('ls', ['-l'], { stdio: 'inherit' }); -
使用场景:
- 子进程需要直接与终端交互(如显示实时日志或接收用户输入)。
- 希望子进程的输出直接打印到父进程的控制台(如命令行工具链)。
其他选项
-
文件描述符(fd) :可以传递一个文件描述符(如
fs.open返回的数值),将子进程的流绑定到指定文件。javascript
复制
const fs = require('fs'); const { spawn } = require('child_process'); const logFile = fs.openSync('output.log', 'w'); const child = spawn('ls', ['-l'], { stdio: ['ignore', logFile, 'ignore'] }); -
流对象:直接传递一个可读/可写流(如
process.stdout)。