我一直在尝试使用AOT和@ angualar / compiler-cli来编译我的Angular应用程序但是我在编译过程中遇到了一个我无法解决的错误。错误说明:
Error encountered resolving symbol values statically.
Calling function 'PanelModule', function calls are not supported.
Consider replacing the function or lambda with a reference to an exported function.
我有我的主要AppModule
和另一个名为PanelModule
的模块。在PanelModule
我有一个forRoot方法,我从AppModule调用这样:
app.module.ts / AppModule
@NgModule( {
imports: [
BrowserModule,
routing,
PanelModule.forRoot(), <----------- If not present it compiles OK
],
declarations: [
AppComponent,
LoginView,
WorkbenchView,
ErrorView,
NotFoundErrorView,
DashboardView,
BackgroundVideoComponent
],
providers: [
{
provide: APP_BASE_HREF,
useValue: URL_BASE
},
CARBON_PROVIDERS,
CARBON_SERVICES_PROVIDERS,
appRoutingProviders,
Title,
],
bootstrap: [ AppComponent ],
} )
export class AppModule {}
panel.module.ts / PanelModule
@NgModule( {
imports: [
CommonModule,
RouterModule,
SemanticModule,
DirectivesModule,
FormsModule
],
declarations: [
HeaderComponent,
...
PaginatorComponent,
],
exports: [
HeaderComponent,
...
PaginatorComponent,
],
providers: []
} )
export class PanelModule {
static forRoot():ModuleWithProviders {
return {
ngModule: PanelModule,
providers: [ HeaderService, SidebarService, RouterService, MyAppsSidebarService, ErrorsAreaService ]
};
}
}
如你所见,我在PanelModule
上没有lambda函数。我也看到你只能在forRoot中只有一个return语句和一个return语句,但这不是我的情况。我不知道发生了什么。
我会把这作为一个答案,试着提供一些帮助,让你前进。我已经有了一些关于这个问题的背景知识,并且已经根据我的需求解决了这个问题,所以我可以告诉你我在这里看到的内容,也许它可以提供帮助。
如果你有任何非静态可解析的逻辑,你将在forRoot中得到AOT错误。例如,如果你这样做:
( passing this obj as args: "{ production: true }" )
forRoot ( args ) {
if ( args.production )...
(or a ternary, e.g. args.production ? this : that)
}
它将在AOT中崩溃。
甚至导出功能和使用工厂等,这是经常推荐的“修复”,但结果并不一致和可靠。我尝试了我能找到的每一个推荐的编译器属性配置,都无济于事(正如许多其他人遇到的那样)。
有一个令人惊讶的直截了当的方式,但显然这不是你的问题。你没有条件,函数调用或任何东西。
但AOT正在为此而哭泣。所以,某种方式,你在forRoot中拥有的东西不能被AOT编译器静态解析。事实上似乎是,forRoot功能还没有真正准备好迎接黄金时段,它非常天真。例如,您无法直接动态配置导入,因为ModuleWithProviders不允许您修改导入(您实际上可以,但不能以任何文档的方式)。
所以答案是:我发现可疑的第一件事就是你没有向forRoot提供任何参数。如果您不使用forRoot来动态配置提供程序,则没有太多意义。事实上,我认为forRoot需要一个参数。所以我会检查出来。
如果做不到这一点,我的猜测就是,这是你的一个进口产品,或者是你的供应商之一。其中一个元素以某种方式做了一些AOT编译器无法静态解析的东西。也许你的自定义类型?
我,我将它们全部删除并尝试编译。如果它有效,你就会知道问题所在。如果没有,则问题在树上更高。
有了整个(可编译的)代码库,我可能会帮助你更多。但就目前而言,当我遇到这个问题时,这就是我追求这个问题的方法。我设法缩小了有问题的因素,这使我开始寻求解决方案。