我需要将后端网址传递给我的Angular2应用,因为生产和开发服务器托管在不同的位置。
我知道我可以在外部config.json中存储这些东西并在启动时加载。但是,在应用程序启动之前,这似乎是对服务器的不必要的额外调用。
或者,我现在所做的是创建一个全局变量,我根据构建注入gulp。我的应用程序不是需要可重用的库我不相信我应该点击意外的全局名称冲突。但这不是一个好习惯。
我想知道是否有第三种更好的解决方案?
答案 0 :(得分:18)
只需将变量放在环境对象中即可。
export const environment = {
production: false,
url: 'http://localhost:3000/api'
};
之后,您可以导入并使用它。 Angular Cli将自动交换文件。
import { environment } from '../environments/environment';
P.S。变量在环境对象中可用。
this.url = environment.url
答案 1 :(得分:6)
我也一直在努力解决上述问题。虽然蒂埃里的答案非常好,但我觉得它太复杂了,因为我只是想要用env vars,所以我觉得我也提出了自己的想法。
1)我首先创建了一个描述我的env vars app.settings.ts
的界面:
export interface IEnvVars {
ENV: string;
API_URL: string;
}
export class AppSettings {
public static env_vars: IEnvVars;
}
2)I added the JavaScript fetch API type definitions to my .d.ts file.(如果您不介意将抓取解析为未解决的问题,则不一定需要,但我确实介意了,所以添加了类型)
3)所以现在我的main.ts
我可以调用返回环境变量的端点:
import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
import {AppSettings,IEnvVars} from "./configs/app.settings";
import {enableProdMode} from "angular2/core";
fetch('/env-vars', {method: 'get'}).then((response) => {
response.json().then((env_vars:IEnvVars) => {
AppSettings.env_vars = env_vars;
if (AppSettings.env_vars.ENV != 'development') enableProdMode();
bootstrap(AppComponent);
});
});
所以现在我只需通过以下方式访问任何服务或组件中的env变种:
import {AppSettings} from "../configs/app.settings";
所以在一个方法等中你可以像:
let customersURL = `${AppSettings.env_vars.API_URL}/customers`;
请注意,您可能需要使用polyfill进行fetch API,因为Safari和IE仍然不支持此功能。 (Link to polyfill exampel)
答案 2 :(得分:2)
我认为这对你有用。 Passing asp.net server parameters to Angular 2 app
这样你可以从html页面注入任何值(可以从服务器获取值,比如当前的环境变量)
答案 3 :(得分:1)
我使用以下方法实现了这一点:
ts
个文件。package.json
并为脚本部分中的每个环境添加了一个新条目。例如: -
"开始:本地":"复制\" config / config.local.ts \" \"常量/ global.constants.ts \" &安培;&安培; npm run start"
global.constants
导入您的应用。npm run start:local
答案 4 :(得分:1)
不仅URL,而且还需要从环境变量中获取其他一些参数。
必须在 build 之前获取环境变量并将其写入call
!由于在运行时访问文件系统,环境等方面存在一些Javascript限制。
为此,首先需要一个用于编写环境变量的模块,并且必须在environment.ts
脚本中使用ts-node
来执行此模块:
build
和您的"scripts": {
.....
"config": "ts-node set-env.ts",
"build": "npm run config && ng build",
....
},
文件:
set-env.ts
当然,您必须将var fs = require('fs');
const targetPath = './src/environments/environment.ts';
const colors = require('colors');
require('dotenv').load();
const envConfigFile = `export const environment = {
ENV_VAR_1: '${process.env.var_1}',
ENV_VAR_n: '${process.env.var_n}',
};`;
console.log(colors.magenta('The content of `environment.ts` will be: \n'));
console.log(colors.grey(envConfigFile));
fs.writeFile(targetPath, envConfigFile, function (err) {
if (err) {
throw console.error(err);
} else {
console.log(colors.magenta(`environment.ts file is created`));
}
});
和ts-node
添加到依赖项中。
,您可以轻松访问environemnt.ts的变量,例如:
dotenv
Node 12 ^,Angular 10 ^,我没有使用较旧的Node / Angular / Typescrip版本进行检查
答案 5 :(得分:0)
在不同的环境中,location.host
的值会有所不同。
将此作为键使用,并加载具有所有网址的相应json
的值。
相关代码可能如下所示:
let env = location.host;
if (env === 'prod.example.com') {
config = 'ProdConfig.json';
} else if (env === 'test.example.com') {
config = 'TestConfig.json';
} else if (env === 'localhost') {
config = 'DevConfig.json';
}
答案 6 :(得分:0)
您在Angular2 +中有一个内置的系统。
每个处理的环境都有 environement.ts
个文件(您可以根据需要定义任意数量)。
每当您需要访问它们时,都可以这样导入
import { environment } from '../environments/environment.ts'
并在代码中访问变量
environement.varName
在angular.json文件中,您可以根据需要创建任意数量的环境,这是一个示例
"build":
{ "configurations":
{
"production": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ], },
"qa": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.qa.ts" } ] },
"staging": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.staging.ts" } ] } } }
在构建应用程序时,您需要提及要为其构建环境的名称。 在这里的一个示例中,我为 qa 环境构建了一个版本。
ng build --configuration qa
完成后,您的 dist 输出文件夹应包含具有 qa 配置的构建输出