介绍
在前端开发中,常常需要使用 shell 命令来完成一些工作,例如构建项目、打包静态资源等。但是在 Node.js 中,原生的 child_process
模块并不方便使用,需要手动处理很多细节问题,而且在不同的平台上表现也不一致。为了解决这些问题,我们可以使用 @dot-store/spawn 这个 npm 包来帮助我们执行 shell 命令。
@dot-store/spawn 是一个功能强大且易于使用的 Node.js 模块,它将 child_process.spawn()
方法封装成了一个更加友好的 API,让我们可以轻松地执行 shell 命令、监控子进程的输出、控制输入/输出流等等。下面就让我们来详细了解 @dot-store/spawn 的使用方法吧!
安装
@dot-store/spawn 可以通过 npm 下载并安装,命令如下:
npm install @dot-store/spawn --save
使用方法
基本用法
用 @dot-store/spawn 执行 shell 命令非常简单,只需要传入一个表示要执行的命令的字符串即可。例如,我们要执行 ls -al
命令来列出当前目录下的所有文件(包括隐藏文件),可以这样写:
const spawn = require('@dot-store/spawn') const proc = spawn('ls -al') proc.on('stdout', data => console.log(data.toString())) proc.on('exit', code => console.log(`Process exited with code ${code}`))
这里,我们通过 require()
引入了 @dot-store/spawn 模块,并使用其 spawn()
方法创建了一个子进程。这个方法只需要传入一个表示要执行的 shell 命令的字符串即可。
我们可以在创建子进程之后,通过控制台输出子进程的结果。这里我们监听了 stdout
事件,即子进程的标准输出流有数据输出的时候,就会触发这个事件。我们把所有子进程的输出都转化成字符串,并输出到控制台中。
另外,我们还监听了 exit
事件,即子进程结束的时候触发的事件。这个事件有一个 code
参数,表示子进程的返回值。我们在 exit
事件的回调函数中打印出这个返回值。
执行这个代码,可以得到如下输出:
total 16 drwxr-xr-x 1 user staff 512B Jul 1 12:00 . drwxr-xr-x 1 user staff 6144B Jul 1 12:00 .. -rw-r--r-- 1 user staff 0B Jul 1 11:59 file1.txt -rw-r--r-- 1 user staff 0B Jul 1 11:59 file2.txt Process exited with code 0
高级用法
@dot-store/spawn 不仅可以简单地执行 shell 命令,还支持更多的配置和控制。下面介绍一些常用的用法:
指定工作目录
有时候我们需要在一个特定的工作目录下执行命令,这个时候可以通过配置 cwd
参数来指定。例如,我们要在 /Users/user/projects/demo
目录下执行 npm install
命令:
const spawn = require('@dot-store/spawn') const proc = spawn('npm install', { cwd: '/Users/user/projects/demo' }) proc.on('stdout', data => console.log(data.toString())) proc.on('exit', code => console.log(`Process exited with code ${code}`))
控制输入流
有时候我们需要把一些数据作为子进程的输入流,这个时候可以调用 process.stdin.write()
方法写入数据。例如,我们要在命令行输入一个字符串,然后传入 grep
命令进行过滤:
-- -------------------- ---- ------- ----- ----- - --------------------------- ----- ---- - ----------- -------- - ------ ---- -- -------------------------- -------- ------------------------------ ------------------- ----------------- ---- -- ----------------------------- --------------- ---- -- -------------------- ------ ---- ---- ----------
在这个例子中,我们把子进程的命令设置为 grep "demo"
,表示过滤出包含 demo
字符串的行。然后,我们手动写入两行数据到子进程的标准输入流中,第一行包含 demo
字符串,第二行不包含。最后,我们调用 process.stdin.end()
方法标识输入流结束。
在回调函数中,我们监听了 stdout
和 exit
事件,输出子进程的标准输出流,并打印出子进程的返回值。执行这个代码,输出应该类似如下:
hello demo Process exited with code 0
监控子进程输出
有时候我们需要及时收到子进程的输出,这个时候可以使用 pipe()
方法,将子进程的输出流传递给另一个流(例如文件流、网络流),以便及时处理子进程的输出。例如,我们要执行一个输出非常多的命令(例如 npm run dev
),并将它的输出保存到日志文件中:
const fs = require('fs') const spawn = require('@dot-store/spawn') const logStream = fs.createWriteStream('app.log') const proc = spawn('npm', ['run', 'dev']) proc.stdout.pipe(logStream) proc.on('exit', code => console.log(`Process exited with code ${code}`))
在这里,我们首先创建了一个写入流(logStream
),并将其传递给 spawn()
方法。这样可以让子进程的输出流,即 proc.stdout
,同时也流入到我们的写入流中。
然后,在 exit
事件的回调函数中,我们打印出子进程的返回值。这里我们忽略了子进程的错误输出流,只将它的标准输出流(proc.stdout
)重定向到我们的写入流上。
执行这个代码,可以得到如下输出:
...(很多日志信息)...
总结
@dot-store/spawn 是一个简单、易用、功能丰富的 Node.js 模块,可以帮助我们快速、方便地执行 shell 命令。我们可以用它来控制子进程的行为、处理子进程的输出、获取子进程的返回值等等。在前端开发中,@dot-store/spawn 是一个非常实用的工具,建议大家都学习并掌握。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066b5851ab1864dac66dd1