Javascript 是否可以在node.js文件中导出也具有IPC挂钩的类?

Javascript 是否可以在node.js文件中导出也具有IPC挂钩的类?,javascript,node.js,ipc,Javascript,Node.js,Ipc,[Node.js v8.10.0] 为了清晰起见,我对这个例子进行了极大的简化。我有3个脚本:parent.js、first.js和second.js parent.js: 'use strict'; const path = require('path'); const {fork} = require('child_process'); const firstScript = path.resolve('first.js'); const first = fork(firstScript

[Node.js v8.10.0]

为了清晰起见,我对这个例子进行了极大的简化。我有3个脚本:parent.js、first.js和second.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');
first.js:

'use strict';

class First {
}

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

module.exports = {First};
second.js:

'use strict';

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

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

第一条收到的消息:原始消息

父级从第一个接收到消息:原始消息

第二条收到的消息:原始消息

父级从第二个接收到消息:原始消息

实际产量:

第一条收到的消息:原始消息

父级首先收到消息:原始消息

第一条收到的消息:原始消息

第二条收到的消息:原始消息

父级从第二个接收到消息:原始消息

父级从第二个接收到消息:原始消息

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


目前,我正在通过将第一个类移动到一个单独的文件来“解决”这个问题。但是我想知道是否有可能将所有内容都保存在一个文件中(也就是说,仍然可以在first.js中导出类,但不能创建与IPC相关的混乱)。

问题是,当您
需要一个脚本时,在后台运行脚本并在最后提取导出。您所看到的完全是逻辑性的-当您运行
$node parent.js

  • 父节点,由
    $node Parent.js创建
  • 首先,由
    fork(firstScript)
  • 第二,由
    fork(secondScript)
  • 另一个第一个,由
    require('./First.js')
  • 告诉我您是否需要我添加一个ascii art流程树来显示消息交换和流程创建,或者如果可以的话

    啊,这是有道理的!但是如何在不执行创建IPC钩子的脚本部分的情况下导出文件

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

    // hello.js
    module.exports = () => console.log('hello world');
    // main.js
    const hello = require('./hello');
    hello();
    
    为了简化工作,最好这样考虑代码,但如果不能这样做,则始终可以根据脚本是必需的还是调用的,阻止运行某些代码,如前所述。在您的情况下,重写
    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};
    

    给出运行
    节点parent.js
    时所描述的预期输出问题是,当
    需要
    脚本时,在引擎盖下运行脚本并在最后提取导出。您所看到的完全是逻辑性的-当您运行
    $node parent.js

  • 父节点,由
    $node Parent.js创建
  • 首先,由
    fork(firstScript)
  • 第二,由
    fork(secondScript)
  • 另一个第一个,由
    require('./First.js')
  • 告诉我您是否需要我添加一个ascii art流程树来显示消息交换和流程创建,或者如果可以的话

    啊,这是有道理的!但是如何在不执行创建IPC钩子的脚本部分的情况下导出文件

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

    // hello.js
    module.exports = () => console.log('hello world');
    // main.js
    const hello = require('./hello');
    hello();
    
    为了简化工作,最好这样考虑代码,但如果不能这样做,则始终可以根据脚本是必需的还是调用的,阻止运行某些代码,如前所述。在您的情况下,重写
    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};
    

    给出运行
    节点parent.js

    时所描述的预期输出,这是有意义的(我假设“另一个第一个”从第二个继承IPC通道,这就是父通道在该通道上接收2条消息的原因)。正如我所说,为了避免这个问题,我已经分离了所有内容——我只是想知道是否可以在不实际运行整个脚本的情况下导出类(在node.js中)。是的!我将编辑我的答案,以便完成格式化!还有其他问题吗?没有,这是有道理的(我假设“另一个第一个”从第二个继承了IPC通道,这就是为什么父通道在该通道上接收2条消息)。正如我所说,为了避免这个问题,我已经分离了所有内容——我只是想知道是否可以在不实际运行整个脚本的情况下导出类(在node.js中)。是的!我将编辑我的答案,以便完成格式化!还有什么问题吗?