如何定位导致JavaScript堆内存溢出的TypeScript文件?
针对你遇到的FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory错误,以及找不到递归类型所在文件的问题,给你几个实用的解决方向:
先给TypeScript服务扩容,让VS Code能完成全项目扫描
你之前设置的typescript.tsserver.experimental.enableProjectDiagnostics没效果,大概率是因为tsserver默认内存不够,还没跑完扫描就崩了。直接在VS Code的settings.json里增加tsserver的内存上限:"typescript.tsserver.maxTsServerMemory": 8192数值可以根据你的机器内存调整,比如16384(对应16G内存),设置后重启VS Code,再打开「问题」面板(Ctrl+Shift+M),就能看到全项目的类型错误,包括递归类型所在的文件。
给tsc增加内存,强制输出错误位置
直接跑tsc watch会崩,但可以给Node进程加内存限制后再执行编译,这样能让tsc跑完足够久,输出错误文件:node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc执行后如果编译失败,终端会直接打印出递归类型所在的文件和行号。
手动排查递归类型的常见场景
递归类型一般是type别名或接口的自引用,比如:type RecursiveType = { value: string; children: RecursiveType[]; };可以用VS Code的全局搜索(Ctrl+Shift+F),搜索
type\s+\w+\s*=\s*{或者interface\s+\w+\s*{,然后检查结果里有没有自引用的类型;或者排查最近修改过的TypeScript文件,毕竟你之前打开过有错误标记的文件,大概率是近期改动的。逐步缩小排查范围
如果项目太大,直接扫描耗时久,可以在tsconfig.json的exclude字段里临时添加一些目录(比如测试目录、文档目录),逐步排除无关文件,直到定位到导致内存溢出的文件。
内容的提问来源于stack exchange,提问作者Alex Ironside

