这是我参与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运行脚本,可以把很多打包、提交、版本更新等等完全自动化,后续会继续更新相关的内容