升级Ionic/Angular后VSCode中ESLint报JavaScript堆内存不足错误
问题描述
近期将Ionic/Angular应用升级至最新版本,相关依赖版本如下:
"@angular/*": "^16.1.1", "@angular-eslint/builder": "16.0.3", "@angular-eslint/eslint-plugin": "16.0.3", "@angular-eslint/eslint-plugin-template": "16.0.3", "@angular-eslint/schematics": "16.0.3", "@angular-eslint/template-parser": "16.0.3", "eslint": "^8.44.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-jsdoc": "46.2.6", "eslint-plugin-prefer-arrow": "1.2.3", "@typescript-eslint/eslint-plugin": "^5.59.7", "@typescript-eslint/parser": "^5.59.7", "eslint-config-prettier": "^8.8.0", "ts-node": "~10.9.1", "typescript": "^5.1.3",
在安装了dbaeumer.vscode-eslint扩展的VSCode中运行应用时,ESLint输出JavaScript堆内存不足的致命错误,无法进行代码检查,错误日志如下:
[Info - 6:07:32 AM] ESLint server is starting. [Info - 6:07:33 AM] ESLint server running in node v16.17.1 [Info - 6:07:33 AM] ESLint server is running. [Info - 6:07:34 AM] ESLint library loaded from: C:\dev\myapp\node_modules\eslint\lib\api.js <--- Last few GCs ---> [37792:00000138004CC000] 31705 ms: Scavenge 3937.6 (4076.3) -> 3936.2 (4077.1) MB, 4.3 / 0.0 ms (average mu = 0.850, current mu = 0.817) allocation failure; [37792:00000138004CC000] 31717 ms: Scavenge 3938.3 (4077.1) -> 3937.1 (4078.6) MB, 4.1 / 0.0 ms (average mu = 0.850, current mu = 0.817) allocation failure; [37792:00000138004CC000] 31732 ms: Scavenge 3939.9 (4078.6) -> 3938.5 (4088.1) MB, 4.5 / 0.0 ms (average mu = 0.850, current mu = 0.817) allocation failure; <--- JS stacktrace ---> FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory 1: 00007FF6237416D6 node::Buffer::New+47862 2: 00007FF62374184D node::OnFatalError+317 3: 00007FF626146E13 v8::internal::WebSnapshotDeserializer::UpdatePointersCallback+787 4: 00007FF626146DA7 v8::internal::WebSnapshotDeserializer::UpdatePointersCallback+679 5: 00007FF6261BF067 v8::CppHeap::CollectGarbageInYoungGenerationForTesting+65495 6: 00007FF624F477B3 v8::CppHeap::GetHeapHandle+201107 7: 00007FF622518ACE v8::CppHeap::CollectStatistics+232910 8: 00007FF622518592 v8::CppHeap::CollectStatistics+231570 9: 00007FF622523232 v8::CppHeap::CollectStatistics+275762 10: 00007FF624822873 Cr_z_uncompress+2817971 11: 00007FF624822B82 Cr_z_uncompress+2818754 12: 00007FF622519583 v8::CppHeap::CollectStatistics+235651 13: 00007FF62250E63B v8::CppHeap::CollectStatistics+190779 14: 00007FF62250A194 v8::CppHeap::CollectStatistics+173204 15: 00007FF6224F945D v8::CppHeap::CollectStatistics+104285 16: 00007FF6224F6C87 v8::CppHeap::CollectStatistics+94087 17: 00007FF6224F4093 v8::CppHeap::CollectStatistics+82835 18: 00007FF624F27151 v8::CppHeap::GetHeapHandle+68401 19: 00007FF624F19090 v8::CppHeap::GetHeapHandle+10864 20: 00007FF62262308A v8::internal::TickSample::GetStackSample+114602 21: 00007FF5BFED7DBC [Info - 6:08:07 AM] Connection to server got closed. Server will restart. true
已知可通过--max-old-space-size参数增加Node.js堆内存,但不清楚如何应用到ESLint中。相同配置在其他小型项目中运行正常,当前项目仅规模稍大,求可行解决方法。
解决方法
1. 配置VSCode ESLint扩展的Node.js参数
打开VSCode设置(快捷键Ctrl+,),搜索ESLint: Node Options,在输入框中填入--max-old-space-size=8192(数值可根据项目大小调整,比如4096、8192,单位为MB)。保存后重启VSCode,让ESLint服务重新加载即可生效。
2. 在package.json中配置ESLint启动脚本
如果需要通过命令行运行ESLint,可在package.json的scripts字段中添加:
"lint": "node --max-old-space-size=8192 node_modules/eslint/bin/eslint.js ."
执行npm run lint时,ESLint会使用指定的堆内存运行。
3. 优化ESLint配置减少内存占用
- 忽略不必要文件:在
.eslintignore中添加node_modules/、dist/、build/等已编译或第三方文件,避免ESLint扫描这些无意义的文件。 - 禁用高内存消耗规则:比如
@typescript-eslint/no-unused-vars的复杂配置、eslint-plugin-jsdoc的部分严格规则,可暂时禁用或调整为更宽松的设置,观察内存占用变化。 - 拆分配置范围:如果项目模块较多,可针对不同目录单独设置ESLint配置文件,缩小单次扫描的文件范围。
4. 升级Node.js版本
当前使用的Node.js版本为16.17.1,升级到较新的LTS版本(如18.x或20.x),新版本V8引擎在内存管理上有优化,可能缓解堆内存不足的问题。
内容的提问来源于stack exchange,提问作者peterc
相关产品推荐
相关产品推荐

