起因

事情是这样的,今天突然有个大学同学问了这么一个问题:如何在JavaScript/Typescript代码中使用shell命令

我思考了很久,查阅了很多资料,因为process这种东西应该是可以带有version版本的,但是事实证明他没有。
又考虑到这种需求多半是要配合框架将node的版本显示在浏览器页面上?我如此想到之后,决定使用node自带的
'child-process'spawn

文档链接:child-process 子进程

const { spawn } = require('child_process')
const ls = spawn('node', ['-v'])

ls.stdout.on('data', (data) => {
  console.log(`nodeVersion: ${data}`)
})

同步子进程

默认情况下,在父 Node.js 进程和衍生的子进程之间建立stdin、stdout和的管道。stderr这些管道的容量有限(且特定于平台)。如果子进程写入标准输出超出该限制而没有捕获输出,则子进程将阻塞等待管道缓冲区接受更多数据。这与 shell 中管道的行为相同。{ stdio: 'ignore' } 如果输出不会被消耗,请使用该选项。

options.env.PATH如果传入options对象,将使用环境变量执行命令查找,否则process.env.PATH将使用。考虑到 Windows 环境变量不区分大小写这一事实,Node.js 将按字典顺序对所有env键进行排序,并选择第一个不区分大小写匹配的PATH键来执行命令查找。env当将对象传递给具有多个变量变体的选项时,这可能会导致 Windows 出现问题PATH。

该child_process.spawn()方法异步生成子进程,而不阻塞 Node.js 事件循环。该child_process.spawnSync() 函数以同步方式提供等效的功能,阻止事件循环,直到生成的进程退出或终止。

为方便起见,该child_process模块提供了一些同步和异步替代child_process.spawn()和 child_process.spawnSync()。这些替代方案中的每一个都在child_process.spawn()or之上实现child_process.spawnSync()。

child_process.exec(): 生成一个 shell 并在该 shell 中运行一个命令,完成时将stdoutand传递stderr给回调函数。
child_process.execFile(): 类似于,child_process.exec()只是它直接生成命令,而不是默认情况下首先生成 shell。
child_process.fork(): 生成一个新的 Node.js 进程并调用一个指定的模块,并建立一个 IPC 通信通道,允许在父子之间发送消息。
child_process.execSync():它的同步版本 child_process.exec()将阻塞 Node.js 事件循环。
child_process.execFileSync():它的同步版本 child_process.execFile()将阻塞 Node.js 事件循环。
对于某些用例,例如自动化 shell 脚本, 同步对应物可能更方便。但是,在许多情况下,同步方法可能会对性能产生重大影响,因为在生成的进程完成时会停止事件循环。

异步子进程

child_process.spawn()、child_process.fork()和方法child_process.exec()都child_process.execFile()遵循其他 Node.js API 典型的惯用异步编程模式。

每个方法都返回一个ChildProcess实例。这些对象实现了 Node.js EventEmitterAPI,允许父进程注册在子进程生命周期中发生某些事件时调用的侦听器函数。

child_process.exec()和child_process.execFile()方法还允许callback指定在子进程终止时调用的可选函数。

轻微调查,有问题联系

最后修改:2023 年 02 月 22 日
收款不要了,给孩子补充点点赞数吧