Angular 15升级至16后出现NG0204错误,无额外详情求助
NG0204的核心是inject()方法被调用在了非注入上下文中,结合15到16的升级场景,常见触发原因及排查点如下:
独立组件的注入写法违规:Angular 16对独立组件的注入规则收紧,若在组件类的属性初始化、静态方法中直接调用
inject(),而非在构造函数或Angular管理的生命周期钩子内调用,就会触发错误。比如:// 错误示例 @Component({ standalone: true }) export class DemoComponent { // 类属性初始化阶段调用inject,脱离注入上下文 userService = inject(UserService); constructor() {} }修正方式:将
inject()移至构造函数内,或改用构造函数参数注入。第三方依赖未适配Angular 16:部分旧版本的第三方库(如UI组件库、状态管理库)内部的
inject()调用逻辑不符合Angular 16的新规则。检查package.json中的依赖版本,升级到官方标注支持Angular 16的最新版本。自定义装饰器/工厂函数的注入问题:项目中自定义的装饰器、服务工厂函数如果包含
inject()调用,Angular 16对这类场景的上下文校验更严格。需确保这些代码仅在Angular的注入上下文(如组件初始化、服务实例化阶段)执行。延迟加载路由的错误写法:若在延迟加载路由的配置中,直接在守卫、解析器的工厂函数外调用
inject(),会导致注入上下文丢失。比如:// 错误示例 const authGuard = () => inject(AuthGuard); const routes: Routes = [{ path: 'dashboard', canActivate: [authGuard] }];修正方式:在守卫类的构造函数中注入依赖,或确保工厂函数在Angular管理的流程内执行。
Zone.js版本不兼容:Angular 16要求Zone.js版本≥0.13.0,若升级Angular后未同步更新Zone.js,可能导致注入上下文判断异常。执行
npm install zone.js@latest更新至兼容版本。Tree-shaking优化误删注入逻辑:Angular 16的Tree-shaking更激进,部分服务的注入逻辑可能被误优化,导致
inject()调用脱离上下文。可临时在angular.json中设置projects.[你的项目名].architect.build.options.optimization: false,关闭优化后启动应用,若错误消失则说明是该问题,需调整服务的注入写法以适配Tree-shaking。
内容的提问来源于stack exchange,提问作者Lakshmi

