[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
- 父级,由
$nodeparent.js
创建 - 首先,由
fork(firstScript) 创建
- 第二个,由
fork(secondScript) 创建
- 另一个 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/