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

Posted

技术标签:

【中文标题】Angular AOT Build:内部错误:未知标识符未定义【英文标题】:Angular AOT Build: Internal error: unknown identifier undefined 【发布时间】:2018-03-15 23:02:10 【问题描述】:

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

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)

依赖关系

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

有人知道为什么会发生此错误吗?

【问题讨论】:

在一个有很多模块的项目上,它有助于在“compiler.umd.js”中的“tokenExpr”方法中添加console.out语句来识别有问题的模块,只需打印出应该的“ctx”参数为您提供损坏模块的路径 【参考方案1】:

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

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

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

@Injectable(
providedIn: 'root'
)

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

嗨,你在供应商那里修复了工厂? @Injectable() 导出类 WindowWrapper 扩展窗口 导出函数 getWindow() 返回窗口; 【参考方案3】:

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

所以我做到了:

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

改成

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

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

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

所有记录在Angular site。

【讨论】:

【参考方案4】:

只是为了完整起见,因为我在不同的上下文中偶然发现了相同的错误。使用导出为 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'] 
  ]
)

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

【讨论】:

【参考方案5】:

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

基类和子类标记为Injectable

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

【讨论】:

【参考方案6】:

这发生在我身上是由于 类继承,BaseClass 和 DriveClass 都有 @Injectable 装饰器。

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


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

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

【讨论】:

这是我的问题。谢谢你。我会花几个小时调试【参考方案7】:

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

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

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

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

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

【讨论】:

【参考方案8】:

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

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

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

这就是我所做的:

    my-lib 中,有一个类:
@Injectable()
export class MyFirstService implement IMyFirstService 

    my-app 中,我声明了一个使用上述服务的模块:
@NgModule(
    providers: [
        
            provide: MY_FIRST_SERVICE_INJECTION_TOKEN,
            useClass: MyFirstService
        
    ]
)
export class MyLittleModule 

    当我运行ng build --prod 时,出现异常。

我就是这样解决的:

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

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

扩展 im4ever 的答案,我遇到了同样的问题。它仅在设置配置时进行构建时出现,而不是在 ng serveng build 上,这让我相信这是一个 AOT 问题。

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

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

我为解决这个问题所做的就是删除我StateService 类定义中拥有的@Injectable() 装饰器。一旦我删除它,错误就全部消失了。

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于Angular AOT Build:内部错误:未知标识符未定义的主要内容,如果未能解决你的问题,请参考以下文章

字段“浏览器”不包含有效的别名配置 AOT 编译错误

在 Angular 5 和 AOT-Build 中使用 @angular 编译器时出错

AOT Build 上的 Kendo Angular2 输入组件损坏

ng build --aot --prod生成文件报错

Angular 2 提前编译中的未知编译器选项“angularCompilerOptions”

在 AOT 中构建 Angular 模块时出现打字稿错误