AOT编译如何配置NGRX/Data

How to configure NGRX/Data for AOT compilation

我有一个来自 NGRX 数据文档的标准设置和一个实体。一切都适用于 JIT,但是当我执行 AOT 时,出现以下错误:

...
Function expressions are not supported in decorators in 'entityConfig'
'entityConfig' references 'ɵ0'
...
Consider changing the function expression into an exported function.

我的实体配置:

const entityMetadata: EntityMetadataMap = {
  Identifiers: {}
};

export const entityConfig = {
  entityMetadata
};

我的模块:

...
import { entityConfig } from './store/entity-metadata';

@NgModule({
  imports: [CommonModule, EntityDataModule.forRoot(entityConfig)]
})
...

这里报错: EntityDataModule.forRoot(entityConfig)

版本:

"@angular/core": "^8.1.1",
"@ngrx/data": "^8.6.0",
"@ngrx/store": "^8.6.0",

如果您将 reducer 用作箭头函数,这是一个已知问题。 请阅读这部分:https://ngrx.io/guide/store/reducers#creating-the-reducer-function

Note: The exported reducer function is necessary as function calls are not supported by the AOT compiler.

你必须用适当的 javascript 函数包装每个减速器。

问题可以通过使用 EntityDefinitionService 来解决:

import { EntityDefinitionService } from '@ngrx/data';
import { entityMetadata } from './store/entity-metadata';

@NgModule({
  imports: [CommonModule]
})
export class NotLazyLoadedFeatureModule {
  constructor(private eds: EntityDefinitionService) {
    eds.registerMetadataMap(entityMetadata);
  }
}

但是 EntityDefinitionService 直接期望 EntityMetadataMap,而不是将其包装在对象中。

export const entityMetadata: EntityMetadataMap = {  -> Use this
  Identifiers: {}
};

/* export const entityConfig = {  -> Not needed anymore
  entityMetadata
};*/

值得一提的是,我将商店拆分为多个模块。它们在技术上不是延迟加载的,但我的 app-store.module.ts 看起来像这样:

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    StoreModule.forRoot({}),
    EffectsModule.forRoot([]),
    EntityDataModule.forRoot({}), <- Only needed once
    NotLazyLoadedFeatureModule, <- Import not lazy loaded modules here
    StoreDevtoolsModule.instrument()
  ]
})
export class AppStoreModule {}

JIT和AOT的区别综合解释:
https://gist.github.com/chuckjaz/65dcc2fd5f4f5463e492ed0cb93bca60