Angular AOT Build: Internal error: unknown identifier undefined

Angular AOT Build: Internal error: unknown identifier undefined

我当前的 Angular 2 项目在 Angular 支持 AOT 功能之前启动。现在,我正在努力让它发挥作用。我收到以下错误,我不知道这意味着什么以及我可以从哪里开始调试问题:

ERROR in Error: Internal error: unknown identifier undefined
at Object.importExpr$ [as importExpr] (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24211:23)
at tokenExpr (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18577:39)
at providerDef (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18480:20)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:18697:77
at Array.map (<anonymous>)
at NgModuleCompiler.compile (...\node_modules\@angular\compiler\bundles\compiler.umd.js:18697:44)
at AotCompiler._compileModule (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24144:32)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:24056:66
at Array.forEach (<anonymous>)
at AotCompiler._compileImplFile (...\node_modules\@angular\compiler\bundles\compiler.umd.js:24056:19)
at ...\node_modules\@angular\compiler\bundles\compiler.umd.js:23969:87
at Array.map (<anonymous>)
at AotCompiler.emitAllImpls (...\node_modules\@angular\compiler\bundles\compiler.umd.js:23969:52)
at CodeGenerator.emit (...\node_modules\@angular\compiler-cli\src\codegen.js:42:46)
at ...\node_modules\@angular\compiler-cli\src\codegen.js:33:61
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)

依赖关系

"@angular/animations": "^4.4.4",
"@angular/common": "^4.4.4",
"@angular/compiler": "^4.4.4",
"@angular/core": "^4.4.4",
"@angular/forms": "^4.4.4",
"@angular/platform-browser": "^4.4.4",
"@angular/platform-browser-dynamic": "^4.4.4",
"@angular/router": "^4.4.4",
"@ngx-translate/core": "^8.0.0",
"@ngx-translate/http-loader": "^2.0.0",
"core-js": "^2.5.1",
"font-awesome": "^4.7.0",
"primeng": "^4.2.1",
"quill": "^1.3.2",
"rxjs": "^5.4.3",
"zone.js": "^0.8.18"

有谁知道为什么会出现此错误?

检查您的模板,也许您在模板中使用了组件中未定义的变量

这部分应用程序导致的问题:

export function windowFactory(): any {
    return window;
}

providers: [{
    provide: Window,
    useFactory: windowFactory
}],

Github: This fails with AoT compiler in Angular CLI, because Window (the browser window) is an interface

尝试提供注入日期而不是注入标记时出现相同的错误。

所以我做了:

providers: [
    { provide: Date, useValue: new Date() }
  ]

并将其更改为

providers: [
    { provide: NOW, useValue: new Date() },
  ],

其中NOW是在依赖它的服务中这样定义的

export const NOW = new InjectionToken<Date>('now');

全部记录在 Angular site.

只是为了完整起见,因为我在不同的上下文中偶然发现了同样的错误。使用导出为 default

的升级 angularjs 服务 class 时,我的构建中发生错误
// Service definition
export default class MyService { /* Registered AngularJS service here */ }

// Module
import MyService from './my-service'

// Upgrade 
export function myServiceFactory(i:any) {
  return i.get('myService');
}

// ngUpgraded Angular main module 
@NgModule({
  providers: [
    { provide: MyService, useFactory: myServiceFactory, deps: ['$injector'] }
  ]
})

删除默认导出解决了这个问题。

对我来说,我为使用 HttpClient 的服务创建了一个基础 class。

基础class和子class被标记为Injectable

我从基础 class 中删除了 Injectable,它解决了问题。

扩展 im4ever 的回答,我 运行 进入了同一问题。它只在设置配置时进行构建时出现,而不是 ng serve 或只是 ng build 这让我相信这是一个 AOT 问题。

当我使用工厂方法注册服务时,我这样做是为了注入 localStorage,我的模块设置如下(为简洁起见缩短)。

providers: [
    {provide: StateService, useFactory: provideStateService}
  ],

我为解决此问题所做的工作是删除我 StateService class 定义上的 @Injectable({}) 装饰器。一旦我删除它,所有错误都消失了。

我在 Angular 6 项目中遇到了同样的错误。

当您 运行 "ng build --prod" 时,请仔细阅读警告消息。它在哪个文件中抛出警告消息(对于 eg:dataservice.ts)。

然后转到那个 (dataService.ts) 文件并删除 @Injectable。

@Injectable({
providedIn: 'root'
})

然后尝试重新构建。对我有用。

在 运行 ng build --prod for Angular 7.1.4 时遇到了这个问题,所以我删除了 Karthi Coimbatore 为我创建的工具提示服务推荐的 @Injectable 以使用 Angular Material 工具提示的位置。

由于 Class 继承,我发生了这种情况,其中 BaseClass 和 DriveClass 都具有 @Injectable装饰师。

@Injectable({
  providedIn: 'root'
})
export class BaseService { 
  ... 
}

@Injectable({
  providedIn: 'root'
})
export class DriveService extends BaseService {
 ... 
}

从 BaseService 中删除 @Injectable 解决了问题。

我 运行 Angular 11(随着时间的推移从 7 升级)。我刚刚收到此错误,但这是因为我不小心还原了我的 tsconfig.json 文件。 angularCompilerOptions 中的 enableIvy 行恢复为 导致 错误的以下设置(至少对我而言):

  "angularCompilerOptions": {
    "fullTemplateTypeCheck": false,
    "strictInjectionParameters": true,
    "enableIvy": false
  }

对于 Angular 11,应该删除 enableIvy 行。我的工作angularCompilerOptions变成了:

  "angularCompilerOptions": {
    "fullTemplateTypeCheck": false,
    "strictInjectionParameters": true
  }

我很确定升级到 11 后设置正确,但我搞砸了还原。

这个问题我遇到过两次,也搜索过两次。 我只是把我自己的答案放在这里 :)

就我而言,当我创建 2 个项目时出现此问题:

  • my-lib(包含可以构建为库并发布到 npmjs 的常用组件)
  • 我的应用程序(主要应用程序)

这是我所做的:

  1. my-lib中有一个class:
@Injectable()
export class MyFirstService implement IMyFirstService {
}
  1. my-app 中,我声明了一个使用上述服务的模块:
@NgModule({
    providers: [
        {
            provide: MY_FIRST_SERVICE_INJECTION_TOKEN,
            useClass: MyFirstService
        }
    ]
})
export class MyLittleModule {
}
  1. 当我运行ng build --prod时出现异常

我是这样解决的:

  • MyFirstService class 中删除 Injectable() 注释。异常消失了。

最后,我只想对未来的我说:

  • 嘿我自己,如果你读到这篇文章,这意味着你已经第 n 次忘记这个痛苦的问题了。 :v