节点 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 格式,您可以使用以下选项之一:

  1. 使用 .mjs 扩展名而不是 .js 命名您的文件。默认情况下,NodeJS 将所​​有 .js 文件视为 CJS 模块,只有名为 .mjs 的文件被视为 ES 模块。上面示例中带有 import ... 的文件应分别命名为 parent.mjschild.mjs
  2. 在您的 package.json 中添加 "type": "module"。这将使 NodeJS 将项目中的所有 .js 文件视为 ES 模块。如果项目中的所有(或几乎所有)文件都使用 import ... 语法,请使用此选项。如果您需要在任何文件中使用 require('foo'); 语法,则必须将其命名为 .cjs 扩展名。
  3. 运行 带有 --input-type=module 标志的节点进程从 STDIN 传递代码。在大多数情况下,此选项不切实际。虽然你可以通过 运行: node --input-type="module" < parent.js 使用它,但请注意文件没有作为参数传递在这里,只有它的内容被重定向到节点进程的 STDIN。