Angular AOT Build:内部错误:未定义的未知标识符

时间:2017-10-04 13:56:59

标签: angular angular2-aot aot angular-aot

我当前的角度项目在角度支持AOT功能之前开始。现在我正试图让它发挥作用。我收到以下错误,我不知道这意味着什么,我可以在哪里开始调试问题。有谁知道为什么会出现这个错误?

依赖

"@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"

错误

ERROR in Error: Internal error: unknown identifier undefined
at Object.importExpr$$1 [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)

11 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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

当您运行“ ng build --prod”时,请仔细阅读警告消息。它在哪个文件中引发警告消息(例如:dataservice.ts)。

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

@Injectable({
providedIn: 'root'
})

然后尝试再次构建。它对我有用。

答案 2 :(得分:2)

尝试提供注射日期而不是注射令牌时出现相同的错误。

所以我做了:

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

并将其更改为

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

其中NOW在依赖于它的服务中定义,如此

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

所有记录在Angular site

答案 3 :(得分:2)

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

的已升级angularjs服务类时,我的构建中发生错误
// 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'] }
  ]
})

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

答案 4 :(得分:1)

这是由于类继承而发生的,在该类中,BaseClass和DriveClass都具有@Injectable装饰器。

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

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

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

答案 5 :(得分:1)

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

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

在 Angular 11 中,enableIvy 行应该被移除。我的工作 angularCompilerOptions变成了:

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

我很确定升级到 11 设置正确,但我搞砸了恢复。

答案 6 :(得分:1)

我两次遇到这个问题并搜索了两次。 我只是把我的答案放在这里供自己将来:)

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

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

这就是我所做的:

  1. my-lib中,有一个类:
@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 时,出现异常。

我是这样解决的:

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

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

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

答案 7 :(得分:0)

检查模板可能您在模板中使用了未在组件中定义的变量

答案 8 :(得分:0)

对我来说,我为使用HttpClient的服务创建了基类。

基类和子类标记为Injectable

我从基类中删除了Injectable,它解决了这个问题。

答案 9 :(得分:0)

在扩展im4ever的答案时,我遇到了同样的问题。它仅在设置配置时进行构建时显示,而不是在Transformable或仅在ng serve上显示,这使我认为这是AOT问题。

使用工厂方法注册服务时(我这样做是为了可以注入localStorage),我的模块设置是这样的(为简洁起见而简化)。

ng build

我要解决的问题是删除了我providers: [ {provide: StateService, useFactory: provideStateService} ], 类定义中使用的@Injectable({})装饰器。一旦删除该错误,所有错误都会消失。

答案 10 :(得分:0)

在为Angular 7.1.4运行ng build --prod时遇到了此问题,因此我删除了Karthi Coimbatore为我创建的TooltipService建议使用的@Injectable,以使用Angular Material工具提示的位置。