Node.js中的ES6样式子进程

时间:2018-07-12 02:26:40

标签: 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) }, 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帮助git tracker上问过这个问题,并指出了问题。在建立IPC连接之前发生send()。将kid.send()放入setTimeout证明了这一点。正如我所指出的,如果没有确认的连接,则不应尝试交换消息。

2 个答案:

答案 0 :(得分:2)

安装babel

npm install babel-register babel-preset-es2015 --save-dev

创建调用index.js的入口点test1.js文件

require('babel-register')({ presets: [ 'es2015' ] });

require('./test1.js');

现在尝试node index.js

➜  node index.js 
Experimental child is alive now
Experimental kid got { msg: 'Hey there kid' }

答案 1 :(得分:0)

你也可以使用'createRequire',它非常简单(用 NodeJs 14.15.5 测试):

import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const shellExec = require('child_process');

并在您的代码中:

shellExec.exec(command,callback);

您也可以使用 shellExec 中的其他方法,例如 ChilldProcess , execFile, execFileSync, Fork, spawn, spawnSync

我经常将这种技术用于不支持“导入”的“旧模块”,例如 MongoDb。