AngularJS中的配置文件


71

创建配置文件(类似于.net中的Web配置),存储URL以及在应用程序部署期间可能会变化的其他常量的最佳方法是什么?

Answers:


87

使用.constant()方法:

angular.module('app').constant('MONGOLAB_CONFIG', {
  baseUrl: '/databases/',
  dbName: 'ascrum'
});

这个例子

然后,您可以将其注入需要常量的位置。

您可以具有不同的文件,以定义用于开发或生产的不同常量,然后使用Grunt之类的工具根据环境使用该文件或该文件。

假设您具有这种文件夹结构:

|-js/
|  |-app.js
|  |-anotherfile.js
|  |-...
|
|-env/
|  |-dev.js
|  |-prod.js
|
|-index.html

dev.js并以不同的值prod.js定义相同的.constant()服务。然后,您可以将正确的文件与gruntFile串联在一起,如下所示:

grunt.registerTask('default', ['concat']);

grunt.initConfig({
  env : process.env.NODE_ENV,
  src: {
    javascript: ['js/*.js'],
    config: ['env/<%= env %>.js']
  },
  concat: {
    javascript: {
      src:['<%= src.config %>', '<%= src.javascript %>'],
      dest:'myapp.js'
    }
  }
});

通过运行,grunt您将获得一个myapp.js包含良好常量的文件。

编辑:使用Gulp,您可以这样操作:

var paths = [
  'env/' + process.env.NODE_ENV + '.js',
  'js/**/*.js',
];

var stream = gulp.src(paths)
  .pipe(plugins.concat('main.js'))
  .pipe(gulp.dest('/output'));

5
这可能是唯一的方法,但最后有一个大问题-如何为不同的环境保持不同的恒定值(例如:dev和production env的baseUrl)。看看这个,可能有助于:stackoverflow.com/questions/16339595/...
谢尔盖·潘菲洛夫

好主意 !您是否有Gulp相同的示例?:)
MaximeBernard

3
另一种选择是使用版本控制系统。忽略配置文件,并添加具有空值,默认值或示例值的模板文件。当有人克隆仓库时,他们必须根据模板创建实际文件。当他们推送到仓库时,自定义的配置文件将不会上传。
QOI

我遇到的问题是Angular2。我想构建一次,然后部署到不同的环境,但是部署将仅获取编译的js文件。
Fabricio

@ the.fabricio:您可以执行QOI建议。使用唯一的配置文件,但从VCS中删除并忽略它。然后,在每个环境上创建正确的配置文件(对于生产环境,这应该是服务器配置步骤的一部分)。但是该文件将不在您的主js包中,而是在第二个请求中单独提供。+由于您的应用可能需要它,因此您应该有一种机制来加载它并等待它。
maxdec 2016年

10

恕我直言,我不喜欢与任务运行程序一起处理配置文件。因为您将需要重新构建整个应用程序,以便每次需要不同的配置时更改一两行。

使用.configangular的好处是一件好事,我会做类似的事情(从第一个答案的示例中借用)

angular.module('app').constant('MONGOLAB_CONFIG', {
  baseUrl: '/databases/',
  dbName: 'ascrum'
});

让我们将其命名为 app.config.js

它将像这样在缩小的脚本之后链接到.html中

<script src="js/app-38e2ba1168.js"></script> //the application's minified script
<script src="/app.config.js"></script>

然后,您可以编辑app.config.js文件而无需重新运行任何任务。因此,您可以app.config.js在不同的机器/环境上拥有不同的文件,而无需一次又一次地重建应用程序


2

跳出框框思考,您真的不想使用.constant,因为它与应用程序相关。使用位于应用程序外部的配置,您可以对环境配置进行更多控制。我在下面提供了一个链接,解释了角度构建本身中具有配置的陷阱。

(function hydrateConfiguration() {
"use strict";
var xhr = new XMLHttpRequest();
xhr.open("get", "conf.json", window);
xhr.onload = function () {
    var status = xhr.status;
    if (status === 200) {
        if (xhr.responseText) {
            var response = JSON.parse(xhr.responseText);
            window.ss_conf = response;
        }
    } else {

        console.error("messages: Could not load confguration -> ERROR ->", status);
    }
};

xhr.send() )());

只是一个简单的示例,其中外部配置文件控制应用程序的状态并向内而不是内部注入值。

https://www.jvandemo.com/how-to-configure-your-angularjs-application-using-environment-variables/


1
这似乎是基于将var导入到window对象上的。如果我错了,请纠正我,但是@Louie Almeda的方法似乎更好,因为它执行相同的方法,但是导入了角度配置,而不是窗口?欢迎意见
redfox05 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.