使用 ts-node 时通过 fork() 调用子进程

invoke a child process via fork() when using ts-node

我有一个打字稿项目,而不是先使用 tsc,我只是 运行 直接通过 ts-node

在我的代码中,我需要使用 fork() 创建一个子进程。

如果我 运行 代码如 child_process.fork('ChildProcess.ts')ChildProcess.ts 包含一些仅打字稿的构造(例如:import {}export、...),那么解释器是 node,而不是 ts-node,将会失败。

可能会推荐使用类似child_process.exec('node ./node_modules/.bin/ts-node ChildProcess.ts)的东西,但我真的want/need在父子进程之间建立的IPC通信通道是专门使用fork()的.

关于如何实现这一点有什么想法吗?

谢谢!

如果 ts-node 不处理 fork 本身(这有点令人惊讶,但我不使用它),并且您需要 IPC,我认为您的选择是:

  • 预先使用 tsc 以便调用 JavaScript 文件,或者

  • 按需使用tscChildProcess.ts文件编译成ChildProcess.js文件,然后fork出ChildProcess.js文件。

the reference所述,分叉进程中的execArgv是从当前进程继承的:

execArgv List of string arguments passed to the executable. Default: process.execArgv.

当入口点运行为:

ts-node index.ts

execArgv 默认为 ts-node 二进制:

[ '...\ts-node\dist\_bin.js' ]

child_process.fork('ChildProcess.ts') 

也与 ts-node 一起运行。

如果在分叉进程时省略文件扩展名,它在开发过程中与 ts-node 一起工作,在生产过程中与 tscnode 一起工作。

在您的 app.ts 文件中:

import { fork } from 'child_process';

fork('./longRunningProcess');

然后您可以在 longRunningProcess.ts 文件中使用 TypeScript 结构。 转译为 app.jslongRunningProcess.js 后,它在 运行 常规 node.

时仍然有效