使用 ts-node 时通过 fork() 调用子进程
Posted
技术标签:
【中文标题】使用 ts-node 时通过 fork() 调用子进程【英文标题】:invoke a child process via fork() when using ts-node 【发布时间】:2019-03-05 06:46:18 【问题描述】:我有一个打字稿项目,而不是首先使用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)
之类的东西,但我真的想要/需要在专门使用fork()
时在父进程和子进程之间建立的 IPC 通信通道。
关于如何实现这一点的任何想法?
谢谢!
【问题讨论】:
import
和 export
不是特定于 TypeScript 的。它们是 ES2015 中引入的标准 javascript。 (Node 现在通过 --experimental-modules
运行时标志对它们进行了实验性的部分支持。)但是,当然,这些都不能帮助您使用可能在文件中的真正的仅 TypeScript 功能,例如类型注释。 :-)
我不确定是什么问题。 fork('ChildProcess.ts')
也应该使用 ts-node 运行它。你能提供一种方法来复制这个问题吗?
是的,没错,我可能选择了不好的例子。所以,是的,假设我正在使用注释,我就是这样。 :-)
【参考方案1】:
正如the reference 所说,分叉进程中的execArgv
继承自当前进程:
execArgv 传递给可执行文件的字符串参数列表。默认值:process.execArgv。
当入口点运行为:
ts-node index.ts
execArgv
默认为ts-node
二进制:
[ '...\\ts-node\\dist\\_bin.js' ]
和
child_process.fork('ChildProcess.ts')
也与ts-node
一起运行。
【讨论】:
啊,你说得对。谢谢。我遇到了问题,因为我为此编写了一个初始测试并使用 jest 来运行通过node
而不是 ts-node
调用的测试。我失去了这一点的网站。我用打字稿写了一个快速的小驱动程序 sn-p 并通过ts-node
运行它,你是对的。 ts-node
被调用并且我的子进程中的打字稿运行良好。现在要弄清楚如何为此编写一个很好的笑话测试。 ;-) 谢谢!
很高兴您很快解决了这个问题。根据您的测试方式,您可能会断言execArgv
。【参考方案2】:
如果在 fork 进程时省略文件扩展名,它在开发过程中与 ts-node
一起使用,在生产中与 tsc
和 node
一起使用。
在您的app.ts
文件中:
import fork from 'child_process';
fork('./longRunningProcess');
然后您可以在 longRunningProcess.ts
文件中包含 TypeScript 结构。
转译为app.js
和longRunningProcess.js
后,在使用常规node
运行时仍然可以工作。
【讨论】:
【参考方案3】:如果ts-node
本身不处理fork
(这有点令人惊讶,但我不使用它),并且您需要 IPC,我认为您的选择是:
事先使用tsc
,以便调用 JavaScript 文件,或者
按需使用tsc
将ChildProcess.ts
文件编译成ChildProcess.js
文件,然后forkChildProcess.js
文件。
【讨论】:
啊,不漂亮,但是是的,我没有想到按需方法。像tsc.compile(['ChildProcess.ts'], ['--out', 'ChildProcess.js'])
后跟fork('ChildProcess.js')
这样的东西可能只是获得我需要的最简单的方法。让我再想一想。谢谢!以上是关于使用 ts-node 时通过 fork() 调用子进程的主要内容,如果未能解决你的问题,请参考以下文章