Angular 6 - 在prod构建中的装饰器错误中不支持函数调用

时间:2018-06-11 14:56:19

标签: angular angular2-aot aot

我正在开发一个Angular 6应用程序,经过一段时间的开发,当我尝试创建一个prod版本

ng build --prod

我遇到了这个错误......

ERROR in src\app\app.module.ts(26,17): Error during template compile of 'AppModule'
  Function expressions are not supported in decorators in 'APP_ROOT_STATE'
    'APP_ROOT_STATE' references 'APP_ROOT_STATE'
      'APP_ROOT_STATE' contains the error at src\app\app.component.ts(20,16)
        Consider changing the function expression into an exported function.

经过一些研究,我已经明确了这个错误是什么以及如何解决它,但与此同时,我在Angular documentation about AOT中找到了这个陈述:

从版本5开始,编译器会在发出.js文件时自动执行此重写。

这意味着什么?我通过使用最新版本的Angular和/或Angular Cli包得到了上述错误。

我应该以某种方式启用此重写吗? 有没有希望在没有重写元数据中的所有lambda的情况下使用AOT?

错误中引用的代码是......

export const APP_ROOT_STATE = {
  name: 'app',
  abstract: true,
  views   : {
    header: { component: CoreUiAppHeaderComponent },
    footer: { component: CoreUiAppFooterComponent }
  },
  onEnter: onEnterStateBreadcrumbHelper(new AppBreadcrumbEntryModel('Home', 'default')),
  onExit: onExitStateBreadcrumbHelper(),
  resolve: [
    {
    token: '_appInitialization',
    deps: [AppBootstrapService],
    resolveFn: (bootstrapSvc) => bootstrapSvc.initApplication()
    }
  ]
};

正是这条线......

resolveFn: (bootstrapSvc) => bootstrapSvc.initApplication()

如果我将其重写为函数并在那里引用函数,则错误消失。像这样......

bootstrapSvcinitApplicationFunction = function(bootstrapSvc) {
  bootstrapSvc.initApplication(); 
}
...
resolveFn: bootstrapSvcinitApplicationFunction

1 个答案:

答案 0 :(得分:2)

很可能角度编译器仅自动重写那些在组件元数据(指令,服务等)中使用的箭头函数,换句话说,仅支持有限的位置。在你的情况下,函数位于其他一些对象中,因此编译器不知道它是否应该重写。