回答
我为我的 Webpack 包做了类似的事情。您可以简单地使用child_process.spawn 执行命令行程序并在节点脚本中处理进程。
这是一个例子:
var spawn = require('child_process').spawn
// ...
// Notice how your arguments are in an array of strings
var child = spawn('./node_modules/.bin/webpack-dev-server', [
'--progress',
'--colors',
'<YOUR ENTRY FILE>'
]);
child.stdout.on('data', function (data) {
process.stdout.write(data);
});
child.stderr.on('data', function (data) {
process.stdout.write(data);
});
child.on('exit', function (data) {
process.stdout.write('I\'m done!');
});
You can handle all of the events you like. 这是一个相当强大的模块,它允许您查看进程的 PID (child.pid),甚至可以在您选择时终止进程 (child.kill())。
附录
一个巧妙的技巧是将所有内容都放入Promise。这是我的script.js 版本的简化示例:
module.exports = function () {
return new Promise(function (resolve, reject) {
var child = spawn('./node_modules/.bin/webpack', [
'-d'
]);
child.stdout.on('data', function (data) {
process.stdout.write(data);
});
child.on('error', function (data) {
reject('Webpack errored!');
});
child.on('exit', function () {
resolve('Webpack completed successfully');
});
});
}
使用此方法,您可以将您的script.js 包含在其他文件中,并使此代码在您的构建系统或其他文件中同步。无限可能!
编辑 child_process.exec 还允许您执行命令行程序:
var exec = require('child_process').exec
// ...
var child = exec('webpack-dev-server --progress --colors <YOUR ENTRY FILES>',
function(err, stdout, stderr) {
if (err) throw err;
else console.log(stdout);
});