【问题标题】:Angular AOT Build: Internal error: unknown identifier undefinedAngular AOT Build:内部错误:未知标识符未定义
【发布时间】: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”参数为您提供损坏模块的路径

标签: angular angular2-aot


【解决方案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 的常用组件)
            • 我的应用程序(主应用程序)

            这就是我所做的:

            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 时,出现异常。

            我就是这样解决的:

            • 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 工具提示的位置。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-10-06
                    • 1970-01-01
                    • 2021-04-22
                    • 1970-01-01
                    • 2018-10-23
                    • 2014-06-05
                    • 2015-05-12
                    相关资源
                    最近更新 更多