尝试使用angular2-json-schema-form和build in prod时出现此错误
在“DemoModule”的模板编译期间出现错误错误在装饰器中不支持函数调用,但调用了“JsonSchemaFormModule”。我发现错误来自:
@NgModule({
declarations: [ AceEditorDirective, DemoComponent, DemoRootComponent ],
imports: [
BrowserModule, BrowserAnimationsModule, FlexLayoutModule, FormsModule,
HttpClientModule, MatButtonModule, MatCardModule, MatCheckboxModule,
MatIconModule, MatMenuModule, MatSelectModule, MatToolbarModule,
RouterModule.forRoot(routes),
NoFrameworkModule, MaterialDesignFrameworkModule,
Bootstrap3FrameworkModule, Bootstrap4FrameworkModule,
JsonSchemaFormModule.forRoot( // the source of the Error
NoFrameworkModule,
MaterialDesignFrameworkModule,
Bootstrap3FrameworkModule,
Bootstrap4FrameworkModule
)
],
bootstrap: [ DemoRootComponent ]
})
在库的源代码中,他们使用这样的东西:
export class JsonSchemaFormModule {
static forRoot(...frameworks): ModuleWithProviders {
const loadFrameworks = frameworks.length ?
frameworks.map(framework => framework.forRoot().providers[0]) :
[{ provide: Framework, useClass: NoFramework, multi: true }];
return {
ngModule: JsonSchemaFormModule,
providers: [
JsonSchemaFormService, FrameworkLibraryService, WidgetLibraryService,
...loadFrameworks
]
};
}
}
当我删除变量loadFramworks
我没有错误但我似乎无法在providers属性中注入框架
正如另一个答案所说,这是AOT的一个问题。在像@NgModule
这样的装饰器中调用的函数必须适合编译器进行静态分析。对此的确切要求是棘手的,因为它们取决于所使用的库和工具的许多因素和版本。
当违规功能在您拥有的库中时,就有行动的余地。在我的例子中,例如,我决定从函数中删除所有局部变量,将其减少为复杂表达式的单个return语句,除了已知有效的RouterModule.forRoot
之外没有函数调用。请参阅Angular Flex Layout项目中的the commit "make withConfig AOT compatible"示例。使用tsconfig.lib.json
中的角度编译器选项也记录了一些评论者对Angular的GitHub问题的工作。
但是,在您的情况下,您似乎无法控制有问题的模块和功能。你一定要把它报告给模块的开发人员。