如何为 TypeScript 编译器(tsc)设置 max-old-space-size?

5

我在GitLab CI上运行tsc作业时遇到了以下错误:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

我运行的脚本是:

tsc -p test/tsconfig.json --noEmit

我已经尝试增加max-old-space-size,方法如下:

  1. cross-env NODE_OPTIONS=--max-old-space-size=8192 yarn print:heapsize && tsc -p test/tsconfig.json --noEmit
  2. cross-env NODE_OPTIONS='--max-old-space-size=8192' yarn print:heapsize && tsc -p test/tsconfig.json --noEmit (只是在变量周围添加额外的引号)
  3. node --max-old-space-size=8192 ./node_modules/.bin/tsc -p test/tsconfig.json --noEmit

选项#1和#2都不起作用,而#3可以正常工作,但我觉得通过二进制文件传递参数给node cli并不好。

所以我的问题是:我该如何通过env变量设置tscmax-old-spce-size或者还有其他好的方法吗?

yarn print:heapsize是我用来检查当前大小的脚本,它在#1和#2中都显示8GB,这是它:

"print:heapsize": "node -e \"console.log(' Current heap size:', (require('v8').getHeapStatistics().total_available_size / 1024 / 1024 / 1024).toFixed(2), 'Gb')\""

以下是输出结果:

enter image description here

3个回答

10
前两个选项都失败了,因为环境变量NODE_OPTIONS=--max-old-space-size=8192仅适用于位于&&之前的第一条命令yarn print:heapsize
如果去掉yarn print:heapsize &&,则预期的编译命令将应用该环境变量: cross-env NODE_OPTIONS=--max-old-space-size=8192 tsc -p test/tsconfig.json --noEmit

实际上,我从8192开始,然后增加到10240,然后是16384 - 只有在它一直失败后,我才添加了“print:heapsize”。 - godblessstrawberry
1
但也许我已经与其他东西链接了它,时间会再次确认,谢谢! - godblessstrawberry
你完全正确,我的初始尝试中有命令链接,非常感谢! - godblessstrawberry

1

如果你只想使用更多的内存来运行tsc,你可以通过npx和新的node-options参数来运行它:

npx --node-options="--max-old-space-size=16000" tsc

我们有一个非常庞大的代码库,tsc 很快就耗尽了内存。我们只在 pre checkin 时使用它进行类型检查,仅仅是为了查看是否有任何编译失败的地方以及测试结果。

如果你安装了足够的 RAM,这个选项似乎运行得非常好,而且你可以将其内存升级到任意大小。

请记住,在非常大的代码库上,这可能需要一次运行 10 分钟以上或更长时间。


-3

tsc已经过时,但您可以在NODE_OPTIONS中使用--max-old-space-size来使用ts-node

请在您的package.json中添加这些选项

{
  "scripts": {
    "start": "NODE_OPTIONS='--max-old-space-size=8192' ts-node index.ts"
   }
}  

在我的情况下,原因是使用了链式和cross-env而不是cross-env-shell,后者会将战争传递给所有被链接的内容。 - godblessstrawberry
4
这有点误导人,专用的 TSC NPM 包已经被弃用了,没错,但 tsc 命令并没有。TypeScript 的 npm 包现在包括了 tsc 在它的 bin 文件夹中,tsc(命令)仍然被用于编译 TypeScript,特别是在生产云管道中... Ts-node 主要是用于本地开发。 - Ryan Mann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接