我是一个后院开发人员,使用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证明了这一点。正如我所指出的,如果没有确认的连接,则不应尝试交换消息。
答案 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。