node自动化构建(一)--child_process

1,269 阅读1分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

今天讲个其他的吧,关于node做前端的自动化构建,这可以使我们的开发少很多烦心事。

自动化构建中有一个很重要的node核心模块child_process,它可以让你创建异步进程,有了这个就可以通过shell脚本完成很多有意思的事情。

1. child_process

* exec

创建一个shell,然后在shell里执行命令。执行完成后,将stdout、stderr作为参数传入回调方法。但是缓存区默认只有200kb的大小,可以通过options.maxBuffer进行设置,所以只运行返回少量返回值的子进程

  const exec = require('child_process').exec;
  
  const child = exec(`cd ${path} && npm run build`)
  child.stdout.on('data', function(data) {
    console.log(data)
  })
  child.stderr.on('data', function(data) {
    console.log('stderr: ' + data)
  })
  child.on('close', function(code) {
    if(code == 0){
      console.log(`打包结束`)
    }else{
      console.log('Error');
    }
  })

* spawn

spawn和exec很相似,不同之处是spawn不会把输出流中的数据做一个缓存,所以没有一个大小的限制,这通常用spawn来运行返回大量数据的子进程,如图像处理,文件读取等。并且spawn吧shell参数放在数组里

  const spawn = require('child_process').spawn;
  
  const child = spawn(`ls`, ['-a'])
  child.stdout.on('data', function(data) {
    console.log(data)
  })
  child.stderr.on('data', function(data) {
    console.log('stderr: ' + data)
  })
  child.on('close', function(code) {
    if(code == 0){
      console.log(`打包结束`)
    }else{
      console.log('Error');
    }
  })

* execFile

.exec()类似,不同点在于,没有创建一个新的shell,备注:execFile()内部最终还是通过spawn()实现的, 如果没有设置 {shell: '/bin/bash'},那么 spawm() 内部对命令的解析会有所不同,execFile('ls -al .') 会直接报错

  const execFile = require('child_process').execFile;
  
  const child = execFile(`/Chris/node`)
  child.stdout.on('data', function(data) {
    console.log(data)
  })
  child.stderr.on('data', function(data) {
    console.log('stderr: ' + data)
  })
  child.on('close', function(code) {
    if(code == 0){
      console.log(`打包结束`)
    }else{
      console.log('Error');
    }
  })

* fork

node还有一个模块叫作cluster,可以用它来创建集群实现负载均衡,cluster的创建进程的方法就是使用了child_process的fork。 fork接受node文件来创建子进程,还有额外的send方法用于发送消息到父进程。

let child = fork("./child.js");

child.on("message",(msg:string) => {
    console.log(`[parent] get a data from child is ${msg}\n`);
});

child.send("\nhello child\n");

* 总结

一般使用最多的应该就是exec和spawn了,目前自己实际的使用场景大概就是在做项目自动化构建的时候,通过node运行脚本,可以把很多打包、提交、版本更新等等完全自动化,后续会继续更新相关的内容