You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 17升级至18后触发NG0203错误,寻求解决方案

解决Angular 18升级后的NG0203注入上下文错误

一、精准定位错误来源

NG0203错误的核心是inject()在非合法上下文被调用,想要快速锁定问题,优先看浏览器控制台的调用栈信息:

  • 展开错误详情,找到调用栈中带有node_modules路径的条目,这些就是触发错误的第三方包或自定义代码文件。
  • 如果调用栈被压缩,可以在Chrome开发者工具中开启「美化代码」按钮({}图标),更清晰地查看代码位置。

二、排查第三方依赖兼容性

从你提供的依赖列表来看,多个包的版本明显不匹配Angular 18,大概率是错误根源:

  • ngx-mat-select-search@8.0.1:该版本对应Angular 8,完全不兼容Angular 18,必须升级到支持Angular 18的v18.x版本。
  • @ngx-translate/core@16.0.4:v16仅支持Angular 16,需升级到v18.x版本适配Angular 18。
  • @material/snackbar@10.0.0:这是Material Design Web Components库,而非Angular Material的组件,版本过老且与Angular 18的注入机制冲突,建议替换为Angular Material的MatSnackBar,或升级到最新版的@material/snackbar。
  • 其他包验证:检查Kendo UI的@progress/kendo-angular-*包,虽然版本18.5.2理论上支持Angular 18,但可查阅官方文档确认是否存在已知的注入上下文问题。

快速排查方法:二分法禁用依赖

暂时注释掉怀疑的第三方模块的导入、声明和使用,逐次启动应用验证错误是否消失,快速定位到具体问题包。

三、修复自定义代码中的隐藏问题

即使你替换了构造函数的@Inject为inject(),仍可能存在其他非法调用场景:

  • 禁止在非注入上下文调用inject():比如普通函数、setTimeout/setInterval回调、异步Promise回调中调用inject(),必须用runInInjectionContext包裹:
    import { inject, runInInjectionContext, Injector } from '@angular/core';
    
    constructor(private injector: Injector) {}
    
    async someAsyncFunction() {
      await somePromise();
      // 用runInInjectionContext包裹inject调用
      runInInjectionContext(this.injector, () => {
        const authService = inject(AuthService);
        authService.doSomething();
      });
    }
    
  • 检查模块 providers 的工厂函数:确保工厂函数正确使用inject(),或通过参数接收Injector,避免在工厂函数外部调用inject()。

四、验证依赖兼容性的工具

  • 使用npm ls或yarn list命令查看依赖的peerDependencies是否满足Angular 18的要求,比如有些包可能声明了peerDependencies: { "@angular/core": "^17.0.0" },这类包需要升级到支持Angular 18的版本。
  • 访问包的npm页面或官方文档,确认其版本与Angular 18的兼容性。

内容的提问来源于stack exchange,提问作者Bruce Wayne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:58:10