javascript - 是否可以导出也具有 IPC Hook 的 node.js 文件中的类?

标签 javascript node.js ipc

[Node.js v8.10.0]

为了清楚起见,我大大简化了这个示例。我有 3 个脚本:parent.js、first.js 和 secondary.js

parent.js:

'use strict';

const path = require('path');
const {fork} = require('child_process');

const firstScript = path.resolve('first.js');
const first = fork(firstScript);

const secondScript = path.resolve('second.js');
const second = fork(secondScript);

first.on('message', message => {
  console.log('parent received message from first: ' + message);
  second.send(message);
});

second.on('message', message => {
  console.log('parent received message from second: ' + message);
});

first.send('original message');

第一个.js:

'use strict';

class First {
}

process.on('message', async (message) => {
  console.log('first received message: ' + message);
  process.send(message);
});

module.exports = {First};

第二个.js:

'use strict';

const {First} = require('./first.js');

process.on('message', message => {
  console.log('second received message: ' + message);
  process.send(message);
});

预期输出:

first received message: original message

parent received message from first: original message

second received message: original message

parent received message from second: original message

实际输出:

first received message: original message

parent received message first: original message

first received message: original message

second received message: original message

parent received message from second: original message

parent received message from second: original message

在这个例子中,First 类没有意义。但这说明了我试图避免的问题。具体来说,const {First} = require('./first.js'); Second.js 中的行对 IPC 造成严重破坏(如实际输出所示,与预期输出相比)。

目前,我正在通过将 First 类移至单独的文件来“解决”此问题。但我想知道是否可以将所有内容保留在一个文件中(即仍然可以在first.js 中导出类——但不会造成与IPC 相关的困惑)。

最佳答案

问题是,当您需要脚本时,脚本会运行并在最后提取导出。您所看到的完全符合逻辑 - 基本上,当您运行 $nodeparent.js

时,有四个进程而不是一个进程
  1. 父级,由$nodeparent.js创建
  2. 首先,由 fork(firstScript) 创建
  3. 第二个,由 fork(secondScript) 创建
  4. 另一个 First,由 require('./first.js') 创建

告诉我您是否需要我添加一个显示消息交换和流程创建的 ASCII 艺术流程树,或者是否可以!

Ah, that makes sense! But... how can I export a file without executing the parts of the script that create IPC hooks?

JavaScript( Node 或 Web)中的一种常见设计模式是仅静音除一个之外的文件。也就是说,所有文件都只是导入/导出类和常量,但只有一个主文件通过引用源代码中其他地方的所有智能来实际触发整个程序。基本上是这样的:

// hello.js
module.exports = () => console.log('hello world');
// main.js
const hello = require('./hello');
hello();

最好将您的代码考虑在内以简化您的工作,但如果您不能,您始终可以根据脚本是必需还是调用来阻止某些代码运行,如here所述。在您的情况下,将 first.js 重写如下:

'use strict';

class First {
}

// called only if invoked as script
if (require.main==module) {
  process.on('message', async (message) => {
    console.log('first received message: ' + message);
    process.send(message);
  });
}

module.exports = {First};

给出您在运行nodeparent.js时描述的预期输出。

关于javascript - 是否可以导出也具有 IPC Hook 的 node.js 文件中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54915625/

相关文章:

javascript - Node.js 中不断出现 "x is not a function"错误

Node.js sinon 在并行执行中 stub 函数导致测试失败

javascript - 按层次结构和名称对具有层次结构的对象数组进行排序

javascript - 为什么我的选项标签没有附加到动态生成的选择标签上

node.js - 为什么我的 cookie 在页面刷新时被删除?快速 session 、redis 和 react

c - (如何)我可以从套接字文件描述符确定套接字族吗

javascript - 通过 ipc 同步发送大对象时 Electron 卡住

windows - 与 Windows 服务通信的控制台应用程序

php - 创建扩展名为 .php 的 javascript 文件

Javascript 将 setTimeOut 链接到 Promise,寻找一个非常示例的示例