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
我有一个来自 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