乐趣区

关于javascript:node利用-childprocess-子进程执行-npm-命令

背景

我的项目打包配置须要辨别环境变量进行区别配置,但这个变量为平台注入的值,非 NODE_ENV,须要获取到注入的值进行配置上的辨别,因而利用 node 中的子过程去执行打包命令,在执行文件中进行辨别。

基础知识

Node.js 是以单线程的模式运行的,但它应用的是事件驱动来解决并发,这样有助于在多核 cpu 的零碎上创立多个子过程,从而进步性能。
每个子过程总是带有三个流对象:child.stdin, child.stdoutchild.stderr。他们可能会共享父过程的 stdio 流,或者也能够是独立的被导流的流对象。

Node 提供了 child_process 模块来创立子过程,办法有:

  • exec – 应用子过程执行命令,缓存子过程的输入,并将子过程的输入以回调函数参数的模式返回。
  • spawn – 应用指定的命令行参数创立新过程。
  • fork – 是 spawn()的非凡模式,用于在子过程中运行的模块,与 spawn 办法不同的是,fork 会在父过程与子过程之间,建设一个通信管道,用于过程之间的通信。

利用子过程执行 npm 的命令应用的就是 exec 办法。

用法

child_process.exec 应用子过程执行命令,缓存子过程的输入,并将子过程的输入以回调函数参数的模式返回。

child_process.exec(command[, options], callback)

理论应用时,创立一个 upload.js 文件,如下:

const {exec} = require('child_process')

const _ENV = 'test'
const COMMAND = `stark upload **/*.css --appkey=1111 --env=${_ENV} --token=2222`

exec(COMMAND, (err, stdout,) => {if (err) {console.log(err.stack)
            console.log('Error code:' + error.code)
            console.log('Signal received:' + error.signal)
        }
        console.log('stdout:' + stdout)
        console.log('stderr:' + stderr)
})

在我的项目的 package.json 中,增加命令:

"scripts": {"upload": "node ./bin/upload",}

执行 npm run upload 即可触发 upload.js 文件中的上传命令,利用子过程实现执行,在执行实现后子过程会主动敞开。

退出移动版