节点 child_process 未触发消息事件
node child_process not firing message event
当我使用 commonJs 语法将消息从 parent.js 发送到 child.js 时,它就可以工作了。在 parent.js 我有
//parent.js
const cp = require('child_process');
let child = cp.fork('./child.js');
child.on('message', (message) =>{
console.log('Parent got message: '+message);
});
// parent sends a message
child.send('Parent sends message');
在 child.js 我有:
// child.js
process.on('message', (m) => {
console.log('child got message:', m);
process.send('child sends message');
});
一切正常,在控制台中我得到:
child got message: Parent sends message
Parent got message: child sends message
但是当我使用 ES6 导入语法时它停止工作:
import * as cp from 'child_process';
我做错了什么,还是 nodejs 的错误?
我的节点版本是16.13.2
在不工作的情况下,我的意思是终端中的光标在闪烁,但我没有收到任何消息,也没有收到任何错误。
import foo from 'foo'
语法仅在 ECMAScript 模块中受支持。从 Node v12 开始支持 ECMAScript 模块(或简称 ESM)(没有实验标志)。然而,NodeJS 传统上使用 CommonJS (CJS) 模块格式 (const foo = require('foo');
)。为了支持这两种格式并确保它们之间的互操作性,NodeJS 要求您(开发人员)明确识别您的文件采用的是两种格式中的哪一种。
要向 NodeJS 表明您的文件是 ESM 格式,您可以使用以下选项之一:
- 使用
.mjs
扩展名而不是 .js
命名您的文件。默认情况下,NodeJS 将所有 .js
文件视为 CJS 模块,只有名为 .mjs
的文件被视为 ES 模块。上面示例中带有 import ...
的文件应分别命名为 parent.mjs
和 child.mjs
。
- 在您的
package.json
中添加 "type": "module"
。这将使 NodeJS 将项目中的所有 .js
文件视为 ES 模块。如果项目中的所有(或几乎所有)文件都使用 import ...
语法,请使用此选项。如果您需要在任何文件中使用 require('foo');
语法,则必须将其命名为 .cjs
扩展名。
- 运行 带有
--input-type=module
标志的节点进程从 STDIN 传递代码。在大多数情况下,此选项不切实际。虽然你可以通过 运行: node --input-type="module" < parent.js
使用它,但请注意文件没有作为参数传递在这里,只有它的内容被重定向到节点进程的 STDIN。
当我使用 commonJs 语法将消息从 parent.js 发送到 child.js 时,它就可以工作了。在 parent.js 我有
//parent.js
const cp = require('child_process');
let child = cp.fork('./child.js');
child.on('message', (message) =>{
console.log('Parent got message: '+message);
});
// parent sends a message
child.send('Parent sends message');
在 child.js 我有:
// child.js
process.on('message', (m) => {
console.log('child got message:', m);
process.send('child sends message');
});
一切正常,在控制台中我得到:
child got message: Parent sends message
Parent got message: child sends message
但是当我使用 ES6 导入语法时它停止工作:
import * as cp from 'child_process';
我做错了什么,还是 nodejs 的错误?
我的节点版本是16.13.2 在不工作的情况下,我的意思是终端中的光标在闪烁,但我没有收到任何消息,也没有收到任何错误。
import foo from 'foo'
语法仅在 ECMAScript 模块中受支持。从 Node v12 开始支持 ECMAScript 模块(或简称 ESM)(没有实验标志)。然而,NodeJS 传统上使用 CommonJS (CJS) 模块格式 (const foo = require('foo');
)。为了支持这两种格式并确保它们之间的互操作性,NodeJS 要求您(开发人员)明确识别您的文件采用的是两种格式中的哪一种。
要向 NodeJS 表明您的文件是 ESM 格式,您可以使用以下选项之一:
- 使用
.mjs
扩展名而不是.js
命名您的文件。默认情况下,NodeJS 将所有.js
文件视为 CJS 模块,只有名为.mjs
的文件被视为 ES 模块。上面示例中带有import ...
的文件应分别命名为parent.mjs
和child.mjs
。 - 在您的
package.json
中添加"type": "module"
。这将使 NodeJS 将项目中的所有.js
文件视为 ES 模块。如果项目中的所有(或几乎所有)文件都使用import ...
语法,请使用此选项。如果您需要在任何文件中使用require('foo');
语法,则必须将其命名为.cjs
扩展名。 - 运行 带有
--input-type=module
标志的节点进程从 STDIN 传递代码。在大多数情况下,此选项不切实际。虽然你可以通过 运行:node --input-type="module" < parent.js
使用它,但请注意文件没有作为参数传递在这里,只有它的内容被重定向到节点进程的 STDIN。