尝试在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
。