【发布时间】:2021-11-12 01:11:37
【问题描述】:
我们的 Angular 12 应用有一个模块,该模块导入我们想要基于 配置文件 配置的依赖项,该文件仅在运行时可用,而不是在编译时。
有问题的包是ng-intercom,尽管我想以后其他包也会出现同样的问题。
动态配置背后的动机是我们的应用程序在 4 个不同的环境中运行,我们不想为每个环境创建单独的构建,因为它们之间的唯一区别是包含后端 URL 和一些应用程序的配置文件ID(如对讲机、Facebook 应用 ID 等)
目前有问题的 import 是这样进行的:
imports: [
...
IntercomModule.forRoot({
appId: env.intercomID,
updateOnRouterChange: true,
}),
...
问题是 appID 应该是可配置的,env 变量应该是动态加载的。目前,它是一个导入并编译到代码中的 JSON,但这意味着我们无法在不为每个环境重新构建代码的情况下针对不同的环境更改它:
import env from '../../assets/environment.json';
我们有一个 APP_INITIALIZER,但是,它不会在解决之前阻止模块被导入:
{
provide: APP_INITIALIZER,
useFactory: AppService.load,
deps: [AppService],
multi: true,
},
...以及相关的配置加载器:
static load(): Promise<void> {
return import('../../assets/environment.json').then((configuration) => {
AppService.configSettings = configuration;
});
}
我们可以使用此配置而不会对我们的组件和服务产生任何问题。
我们设法在angularx-social-login 的配置中实现了我们想要的结果:
providers: [
...
{
provide: 'SocialAuthServiceConfig',
useValue: new Promise(async resolve => {
const config = await AppService.config();
resolve({
autoLogin: true,
providers: [
{
id: FacebookLoginProvider.PROVIDER_ID,
provider: new FacebookLoginProvider(config.facebookApi),
}
]
} as SocialAuthServiceConfig);
...
]
SocialAuthServiceConfig 是一个提供者,但是我们找不到类似配置 ng-intercom 导入的方法。
我们能以某种方式实现这一目标吗? 有没有办法动态配置模块导入?
【问题讨论】:
-
你试过使用环境变量吗?并配置为
appId: proccess.env.INTERCOM_ID! -
在启动 Angular 应用程序之前,您可以在运行时加载任何内容,例如 stackoverflow.com/questions/56431192/… 另请参阅 stackoverflow.com/questions/54469571/…
-
@strdr4605 我们最初计划使用环境变量而不是配置文件,但是在我们的环境中会更难配置,此时我们宁愿不拆分我们的配置在环境变量和配置文件之间。
-
@yurzui 谢谢,遗憾的是我不能让它这样工作,我将我的配置注入到 platformBrowserDynamic 的 extraProviders 参数中,但是我没有找到在@NgModule 中实际访问它的方法配置,它仍然,总是未定义。我的怀疑是 @NgModule 配置在导入到 main.ts 文件(包含 bootstrapModule() 逻辑)时实际上得到了评估,但我可能是错的。因此,我选择了其他解决方案。
标签: angular typescript intercom