javascript - 装饰器不支持 Angular 6 Prod 函数调用,但调用了“..Module”
问题描述
尝试使用 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 项目中的提交“make withConfig AOT compatible”。tsconfig.lib.json
一些评论者在 Angular 的 GitHub 问题上也记录了使用 Angular编译器选项。
但是,在您的情况下,您似乎无法控制有问题的模块和功能。您绝对应该将其报告给模块的开发人员。
推荐阅读
- ios - 我想从另一个 ViewController 调用我的函数
- reactjs - 将客户端和服务器部署到同一个虚拟机
- sql-server - 我们 MSAccess 是否可以通过 SQL Server 中的外部链接视图插入数据?
- javascript - 选择下拉触发多个页面重新加载
- rider - 如何在 jetbrains Rider 中运行 blazor wasm
- nginx - NGINX show default image if not found
- angular - 使用 Angular Universal 的服务器上的 TLS (HTTPS)
- azure-sql-managed-instance - 使用 Azure 托管实例的 Get-AzSqlDatabaseLongTermRetentionPolicy 和 Set-AzSqlDatabaseLongTermRetentionPolicy 的服务器名称
- python-3.x - PokeAPI & Flask:在 API 上结合不同的属性
- xml - 使用 xslt 打印没有最外层根节点的 xml 数据