不幸的是,在 Angular 中无法读取类似于 nodejs 或 Spring Boot 等服务器框架提供的机制的环境变量。
但是,您可以在 Angular 应用程序启动之前从服务器加载环境(请在采用此路径之前阅读下面的缺点)。
从服务器加载环境变量:
- 从根模块(例如 AppModule)中删除引导组件,使其不会自动引导
- 在 root 中创建一个加载环境变量的单例服务,例如:
import { Injectable } from "@angular/core";
@Injectable({ providedIn: "root" })
export class EnvService {
public myEnv: string;
fetchEnv() {
// This has to retrieved from some server.
return fetch("some-url").then(env => {this.myEnv = env.myEnv; return Promise.resolve("env loaded");};
}
}
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent, HelloComponent]
})
export class AppModule {
constructor(private envService: EnvService) {}
ngDoBootstrap(app) {
this.envService.fetchEnv().then(() => app.bootstrap(AppComponent));
}
}
这种方法有几个缺点:
- 在加载其他环境变量之前,必须知道从中检索环境设置的 url
- 如果无法加载环境变量,Angular 应用程序将无法启动。当您使用 Docker 时,您可以在 Docker 容器内托管一个小型 Web 服务器,该服务器在 Angular 应用程序的专用端点上提供环境变量。但是,这可能会带来一些问题,因为这会使创建 Angular Docker 容器变得更加复杂。
因此,我建议在构建期间配置环境变量。
有两种方法可以设置环境变量在构建过程中:
1) 使用自定义 webpack 配置在构建中设置环境变量
看到这个article。
您可以在 angular.json 中指定自定义 webpack 配置:
"architect": {
"build": {
"builder": "@angular-builders/custom-webpack:browser",
"options": {
"customWebpackConfig": {
"path": "extra-webpack.config.js"
},
...
webpack 配置文件如下所示:
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env': {
// Here you can set your env variables.
SERVER_URL: JSON.stringify(process.env.SERVER_URL)
}
})
]
}
这个方法需要更多的依赖:
@angular-builders/custom-webpack
dotenv
2) 在构建过程中动态创建环境文件
参见例如自动生成的 src/environments/environment.prod.ts。
您可以使用正确的环境值生成此文件,或在构建期间替换此文件中的占位符。
编辑:另见法比奥的回答。您可能不希望您的用户知道 S3 存储桶,如果可能,应该通过 Web 服务器将您的请求路由到存储桶。