尝试在Windows上使用Gulp和Babel来分离Node.js进程

我的应用程序是用同构JavaScript构build的,我使用Gulp任务在新实例上运行Node.js服务器,然后侦听文件更改以重新启动服务器并重新加载浏览器(使用Browsersync )。

我想使用Babel在ECMAScript 6中编写我的服务器端代码,以及我的客户端代码。 我想避免使用Babel node_modules/.bin/babel-core.cmd server.js ,而是使用node_modules/.bin/babel-core.cmd server.js命令,但是child_process.fork()只允许执行一个可执行文件:

 let child = cp.fork('server.js', [], { execPath: path.normalize('node_modules/.bin/babel-node.cmd'), env: _.assign({NODE_ENV: 'development'}, process.env) }); 

此脚本不起作用,并按照预期引发以下错误:

 child_process.js:588 p.open(fd); ^ Error: EINVAL, invalid argument at Error (native) at Object.exports._forkChild (child_process.js:588:5) at Function.startup.processChannel (node.js:704:10) at startup (node.js:59:15) at node.js:814:3 

我想使用child_process.fork()来处理这种情况。 child_process.spawn()在这里不起作用,因为两个Node.js进程之间没有直接的通信。 我正在听事件来执行操作:

 // server.js server.listen(port, function() { if (process.send) { process.send('online'); } else { ... } }); // gulpfile.babel.js child.on('message', (message) => { if (message.match(/^online$/)) { if (browserSyncServer) { browserSyncServer.reload(); } if (!started) { started = true; gulp.watch(config.serverScripts, () => { plugins.util.log('Restarting development server.'); server.kill('SIGTERM'); server = startup(); }); cb(); } } }); 

任何解决方法呢? 或者我被迫在我的服务器端代码中直接使用Babel填充?

您可以使用execPath选项来更改它用于生成节点进程的execPath

例如,如果我想用babel-node而不是node产生一个节点服务器,我可以input:

 process.fork('/path/to/server.js', { execPath: "babel-node" }, function(error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); if (error !== null) { console.log('exec error: ' + error); } }); 

我有这个问题很好。 有了这个问题,我打开摩卡我可以解决这个问题。

运行babel-node node_modules/mocha/bin/_mocha test.js默认将编译器应用到subprocess,并且不需要设置execPath

PS:一旦你用babel-node运行mocha ,就不需要传递--require--compilers