Javascript Node.js中的ES6样式子进程
我是一名后院开发人员,在许多项目中使用Node.js。我还尝试在可能的情况下使用ES6类,因为我更喜欢采用这种结构。然而,我在让子进程与ES6类一起运行时遇到了问题 对于测试,test1.js是一个传统模块:Javascript Node.js中的ES6样式子进程,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我是一名后院开发人员,在许多项目中使用Node.js。我还尝试在可能的情况下使用ES6类,因为我更喜欢采用这种结构。然而,我在让子进程与ES6类一起运行时遇到了问题 对于测试,test1.js是一个传统模块: var cp = require( 'child_process' ); var kid = cp.fork( 'test2.js' ); kid.send( {msg: "Hey there kid"} ); setTimeout( () => { process.exit(0)
var cp = require( 'child_process' );
var kid = cp.fork( 'test2.js' );
kid.send( {msg: "Hey there kid"} );
setTimeout( () => { process.exit(0) }, 2000 );
和test2.js
console.log( "Regular child is alive now" );
function yay( message ) { console.log( "Regular kid got", message ); }
process.on( 'message', (m) => { yay(m) } );
ES6中相同,test1.mjs:
import cp from 'child_process';
const kid = cp.fork( 'test2.mjs' );
kid.send( { msg: "Hey there kid" } );
setTimeout( () => { process.exit(0) }, 2000 );
和test2.mjs
class Test2 {
constructor() {
console.log( "Experimental child is alive now" );
}
yay(message) {
console.log( "Experimental kid got", message );
}
}
const test2 = new Test2();
process.on( 'message', (m) => { test2.yay(m) } );
执行这些操作时,只有传统的子级接收消息。实验版记录了它的实例化,但没有收到任何消息
我做错了什么?或者ES6模块是否超出了Node.js的范围(使用--experimental modules标志)
编辑:
我也在n Node.js help git tracker上问过这个问题,并指出了这个问题。send()在IPC连接建立之前发生。将kid.send()放入setTimeout可以演示这一点。正如有人向我指出的那样,在没有确认连接的情况下,不应尝试任何消息交换。安装巴贝尔
npm install babel-register babel-preset-es2015 --save-dev
创建调用test1.js
require('babel-register')({ presets: [ 'es2015' ] });
require('./test1.js');
➜ node index.js
Experimental child is alive now
Experimental kid got { msg: 'Hey there kid' }
现在尝试node index.js
require('babel-register')({ presets: [ 'es2015' ] });
require('./test1.js');
➜ node index.js
Experimental child is alive now
Experimental kid got { msg: 'Hey there kid' }
您还可以使用“createRequire”,它非常简单(使用NodeJs 14.15.5测试): 在您的代码中:
shellExec.exec(command,callback);
您还可以使用shellExec中的其他方法,如
ChilldProcess、execFile、execFileSync、Fork、spawn、spawnSync
我经常将此技术用于不支持“导入”的“旧模块”,如MongoDb。您使用的是哪个版本的节点?对我来说,在v8.10.0上工作很好,我喜欢后院开发者的部分…如果你的节点版本不支持ES6,也许可以使用Babel transpilation?@Nitin,你是否收到了“experimental kid get…”的消息?我正在运行8个最新版本,只是离开机器一段时间。@Nitin,确认一下,我正在运行8.11.2。我收到了“实验中的孩子现在还活着”的信息,但不是“实验中的孩子得到了…”的信息。谢谢你的例子。我真的希望不用从巴别塔那里传来消息就可以工作。我正在深入研究这个问题。这似乎与IPC和ES6有关。不过,这可能是一个选项。请注意对文章的编辑。我的测试用例中的问题已经确定。谢谢!已经兜了好长时间的圈子了