【问题标题】:Configuration file in AngularJSAngularJS 中的配置文件
【发布时间】:2013-07-26 10:24:07
【问题描述】:

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

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    使用.constant() 方法:

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

    喜欢this example

    然后你可以把它注入你需要常量的地方。

    你可以有不同的文件定义不同的常量用于开发或生产,然后根据环境使用像 Grunt 这样的工具来使用这个或那个文件。

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

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

    dev.jsprod.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'));
    

    【讨论】:

    • 这可能是唯一的方法,但它最后有一个大问题 - 如何为不同的环境保持不同的常量值(例如:baseUrl 用于开发和生产环境)。看看这个,可能有帮助:stackoverflow.com/questions/16339595/…
    • 好主意! Gulp 有同样的例子吗? :)
    • 另一种选择是使用您的版本控制系统。忽略配置文件并添加具有空值、默认值或示例值的模板文件。当有人克隆存储库时,他们必须根据模板创建实际文件。当他们推送到存储库时,不会上传自定义配置文件。
    • 我遇到的问题是Angular 2。我想构建一次,然后部署到不同的环境,但是部署只会得到编译好的js文件。
    • @the.fabricio:你可以按照 QOI 的建议去做。使用唯一的配置文件,但从您的 VCS 中删除并忽略它。然后在每个环境中创建正确的配置文件(对于生产,这应该是服务器配置步骤的一部分)。但是该文件不会在您的主 js 包中,它会在第二个请求中单独出现。 + 由于您的应用可能需要它,您应该有一种机制来加载它并等待它。
    【解决方案2】:

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

    使用角度的.config 是一件好事,我会做类似的事情(借用第一个答案的例子)

    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 文件,而无需一次又一次地重新构建应用程序

    【讨论】:

      【解决方案3】:

      跳出框框思考,您并不想使用 .constant,因为它与应用程序相关联。使用位于应用程序之外的配置,您可以更好地控制环境配置。我在下面提供了一个链接,解释了在 Angular 构建本身中进行配置的缺陷。

      (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/

      【讨论】:

      • 这似乎是基于将您的变量导入window 对象。如果我错了,请纠正我,但@Louie Almeda 的方法似乎更好,因为它使用相同的方法,但导入到角度配置,而不是窗口?欢迎发表意见
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2019-08-11
      • 2016-10-13
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多