Angular:VSCode运行ngcc导致性能异常的问题咨询
问题拆解与解答
1. 这个现象的原因是什么?
首先得明确ngcc是什么——它是Angular Compatibility Compiler的缩写,专门用来把旧版本的Angular库转换成能兼容Angular 9+默认Ivy编译器的格式。
VSCode里的Angular Language Service插件,会在检测到项目中有未适配Ivy的依赖、或是tsconfig配置发生变化(比如你更新VSCode后插件重新初始化)时,自动触发ngcc批量处理依赖。你看到的状态栏提示,就是插件在后台执行这个转换任务。
至于为什么会卡界面、VSCode变卡、补全失效?核心原因有两个:
ngcc处理大量依赖时会占用极高的CPU和内存资源,直接抢占了VSCode本身的运行资源;- 如果某些依赖的转换过程卡住(比如依赖本身存在兼容性问题),
ngcc会持续运行,导致语言服务被完全阻塞,自然没法正常提供代码补全、导入提示这类功能。
2. ngcc运行是否必要?
分两种情况判断:
- 如果你的项目用的是Angular 9+,且所有第三方依赖都已经适配了Ivy(比如Angular官方库的新版本、标注了
"sideEffects": false的包),那ngcc完全没必要运行; - 如果项目里有旧的第三方库还没升级适配Ivy,那
ngcc必须运行——否则这些库没法在Ivy环境下被编译,甚至连语言服务都识别不了它们。
3. 能否禁用ngcc?
当然可以,给你三种不同场景的禁用方案:
方案一:完全关闭Ivy编译器(适合不需要Ivy新特性的旧项目)
在项目根目录的tsconfig.json里添加以下配置:"angularCompilerOptions": { "enableIvy": false }关闭Ivy后,
ngcc就失去了触发前提,不会再运行。方案二:禁用VSCode插件自动调用ngcc(适合已经手动处理过依赖的项目)
打开VSCode设置(Ctrl+,),搜索angular.ngcc.enabled,把这个选项设为false。这样插件就不会自动触发ngcc了,但如果依赖没提前处理,语言服务可能识别不了旧依赖。方案三:手动一次性运行ngcc(推荐,兼顾兼容性和性能)
在项目根目录执行以下命令,一次性处理所有依赖:npx ngcc --properties es2020 browser module main --first-only --create-ivy-entry-points这个命令会把所有依赖转换成Ivy兼容格式,之后VSCode插件就不会再自动跑
ngcc了,既保证兼容性,又不会占用编辑器资源。
4. 这是否属于插件Bug?
大部分情况是正常的功能逻辑,但确实存在插件优化不足的问题:
- 比如
ngcc运行时没有限制资源占用,导致VSCode卡顿; - 少数场景下(比如依赖缓存失效、tsconfig频繁变更),插件会重复触发
ngcc甚至陷入循环,这就属于明确的Bug了。
如果你遇到的是后者,可以去Angular Language Service的官方仓库提交Issue,附上你的VSCode版本、插件版本、项目依赖清单,开发团队一般会很快跟进排查。
内容的提问来源于stack exchange,提问作者netdjw

