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')常用 options:cwd 工作目录、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:
| exec | spawn | |
|---|---|---|
| 返回类型 | Buffer(有 200KB 上限) | Stream(无上限,流式) |
| 完成判断 | 靠返回的 buffer | close 事件 + 状态码 |
| 适合场景 | 短命令、少量输出 | 大量数据、实时输出 |
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('我是子进程')