Skip to content

Node.js child_process 模块

子进程是 Node.js 核心 API,用于执行 shell 命令、处理 CPU 密集型任务、编写前端工程化工具等。

7 个 API

API说明
exec执行命令(异步)
execSync执行命令(同步)
execFile执行可执行文件(异步)
execFileSync执行可执行文件(同步)
spawn执行命令,返回流(异步)
spawnSync执行命令(同步)
fork创建 Node 子进程(IPC 通信)

exec → execFile → spawn 底层依次调用:exec 通过 execFile 实现,execFile 通过 spawn 实现。

exec / execSync

js
const { exec, execSync } = require('child_process')

// 异步
exec('node -v', (err, stdout, stderr) => {
  if (err) return console.error(err)
  console.log(stdout.toString())
})

// 同步
const version = execSync('node -v')
console.log(version.toString('utf-8'))

// 打开应用
execSync('start chrome http://www.baidu.com --incognito')

常用 optionscwd 工作目录、env 环境变量、timeout 超时、maxBuffer(默认 200KB 限制)

execFile

适合执行脚本文件(.sh / .cmd / .bat 等):

js
execFile(path.resolve(process.cwd(), './bat.cmd'), null, (err, stdout) => {
  console.log(stdout.toString())
})

spawn — 流式输出

适合处理大量数据、实时输出。返回流,无 buffer 上限,通过 close 事件获取状态码。

js
const { spawn } = require('child_process')

const { stdout } = spawn('netstat', ['-an'])

stdout.on('data', (stream) => {
  console.log(stream.toString())  // 边执行边输出
})

exec vs spawn:

execspawn
返回类型Buffer(有 200KB 上限)Stream(无上限,流式)
完成判断靠返回的 bufferclose 事件 + 状态码
适合场景短命令、少量输出大量数据、实时输出

fork — Node 子进程 + IPC 通信

适合 CPU 密集型计算,避免阻塞主进程。fork 基于 IPC 通道通信。

主进程 index.js:

js
const { fork } = require('child_process')
const child = fork('./test.js')

child.send('我是主进程')
child.on('message', (data) => {
  console.log('收到子进程消息:', data)
})

子进程 test.js:

js
process.on('message', (data) => {
  console.log('收到主进程消息:', data)
})
process.send('我是子进程')