我是角度新手。我已将一个角度应用程序部署到 aws 中的 docker 容器中。该应用程序需要连接到 aws s3 存储桶。我不需要对 aws 密钥进行硬编码,因此我在 docker 中设置了一个环境变量。Angular 的部署使得 ng 构建中的 dist 文件夹由 nginx docker 容器提供服务。
一旦将 dist 文件夹中的内容提供到服务器中,是否可以通过角度读取服务器环境变量?就像php和nodejs中的env函数一样
不幸的是,在 Angular 中没有办法读取环境变量,类似于 Nodejs 或 Spring Boot 等服务器框架提供的机制。
不过,您可以在 Angular 应用程序引导之前从服务器加载环境(请在采用此路径之前阅读下面的缺点)。
从服务器加载环境变量:
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");};
}
}
Run Code Online (Sandbox Code Playgroud)
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent, HelloComponent]
})
export class AppModule {
constructor(private envService: EnvService) {}
ngDoBootstrap(app) {
this.envService.fetchEnv().then(() => app.bootstrap(AppComponent));
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法有几个缺点:
因此,我建议在构建期间配置环境变量。
在构建过程中可以通过两种方式设置环境变量:
1) 使用自定义 webpack 配置在构建中设置环境变量
请参阅这篇文章。
您可以在 angular.json 中指定自定义 webpack 配置:
"architect": {
"build": {
"builder": "@angular-builders/custom-webpack:browser",
"options": {
"customWebpackConfig": {
"path": "extra-webpack.config.js"
},
...
Run Code Online (Sandbox Code Playgroud)
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)
}
})
]
}
Run Code Online (Sandbox Code Playgroud)
此方法需要更多依赖项:
@angular-builders/custom-webpack
dotenv
Run Code Online (Sandbox Code Playgroud)
2)构建时动态创建环境文件
例如,请参阅自动生成的 src/environments/environment.prod.ts。您可以使用正确的环境值生成此文件,或在构建过程中替换此文件中的占位符。
编辑:另请参阅法比奥的回答。无论如何,您可能不希望用户知道 S3 存储桶,并且应该在可能的情况下通过 Web 服务器将您的请求路由到该存储桶。
| 归档时间: |
|
| 查看次数: |
14533 次 |
| 最近记录: |