我发现APP_INITIALIZER
在其他服务提供商需要注入配置的情况下,使用 an不起作用。它们可以在APP_INITIALIZER
运行之前实例化。
我已经看到其他解决方案fetch
用于读取 config.json 文件并platformBrowserDynamic()
在引导根module之前使用参数中的注入令牌提供它。但fetch
并非所有浏览器都支持,尤其是我定位的移动设备的 WebView 浏览器。
以下是适用于 PWA 和移动设备 (WebView) 的解决方案。注意:到目前为止,我只在 Android 中进行过测试;在家工作意味着我无法使用 Mac 进行构建。
在main.ts
:
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
import { APP_CONFIG } from './app/lib/angular/injection-tokens';
function configListener() {
try {
const configuration = JSON.parse(this.responseText);
// pass config to bootstrap process using an injection token
platformBrowserDynamic([
{ provide: APP_CONFIG, useValue: configuration }
])
.bootstrapModule(AppModule)
.catch(err => console.error(err));
} catch (error) {
console.error(error);
}
}
function configFailed(evt) {
console.error('Error: retrieving config.json');
}
if (environment.production) {
enableProdMode();
}
const request = new XMLHttpRequest();
request.addEventListener('load', configListener);
request.addEventListener('error', configFailed);
request.open('GET', './assets/config/config.json');
request.send();
这段代码:
- 启动对
config.json
文件的异步请求。
- 请求完成后,将 JSON 解析为 Javascript 对象
APP_CONFIG
在引导之前使用注入令牌提供值。
- 最后引导根module。
APP_CONFIG
然后可以将其注入到任何其他提供程序中app-module.ts
,并且它将被定义。例如,我可以使用以下内容初始化FIREBASE_OPTIONS
注入令牌@angular/fire
:
{
provide: FIREBASE_OPTIONS,
useFactory: (config: IConfig) => config.firebaseConfig,
deps: [APP_CONFIG]
}
我发现这整个事情对于一个非常常见的需求来说是一件非常困难(而且很棘手)的事情。希望在不久的将来会有更好的方法,例如支持异步提供者工厂。
其余代码的完整性......
在app/lib/angular/injection-tokens.ts
:
import { InjectionToken } from '@angular/core';
import { IConfig } from '../config/config';
export const APP_CONFIG = new InjectionToken<IConfig>('app-config');
并在app/lib/config/config.ts
我为我的 JSON 配置文件定义接口:
export interface IConfig {
name: string;
version: string;
instance: string;
firebaseConfig: {
apiKey: string;
// etc
}
}
配置存储在assets/config/config.json
:
{
"name": "my-app",
"version": "#{Build.BuildNumber}#",
"instance": "localdev",
"firebaseConfig": {
"apiKey": "abcd"
...
}
}
注意:我使用 Azure DevOps 任务插入 Build.BuildNumber 并在部署时为不同的部署环境替换其他设置。