单页应用程序外部配置(不在节点JS上)

时间:2014-06-02 19:23:37

标签: javascript apache angularjs backbone.js ember.js

我正在寻找一个参考或答案,我认为这是一个非常常见的问题,当前实现JavaScript MVC框架的人(如Angular,Ember或Backbone)会遇到。

我正在寻找一种方法或通用模式来外化JS领域中可访问的应用程序属性。允许javascript加载服务器端属性的东西,例如应用程序根目录外部的端点,盐等。我遇到的问题是浏览器通常无法访问文件系统,因为这是一个安全问题。

因此,如果存在这样的事物,那么在可部署工件之外加载可配置属性的推荐方法是什么?

如果没有,目前正在使用或正在实施哪些被认为是针对此类问题的推荐方法?

我正在寻找一个交叉兼容的答案(Google Chrome很棒,我同意)。

2 个答案:

答案 0 :(得分:1)

数据驱动的本地存储模式

想出来!!

我们的想法是根据约定配置命名加载配置属性,其中所有属性都是从目标主机名派生的。也就是说,主机名将派生一个可信端点,该端点将相应的属性加载到应用程序。这些应用程序属性将包含在运行时相对的信息。运行时信息将提供给集成部分,然后在引导启动时通过属性迭代进行通信。

为了简单起见,我们在这里只使用两个属性:

此实现特定于Ember JS,但总体思路应该是可移植的

我目前正在将这个问题的范围缩小到一个特定的技术视角,即Ember JS提供以下适用于我的补救措施,并希望它能帮助你解决同一问题的任何人。

启动时的Ember.Application.initializer实施

initialize: function (container, application) { 
      var origin = window.location.origin;
      var host = window.location.hostname;
      var port = window.location.port;
      var configurationEndPoint = '';


      //local mode
     if(host === 'localhost'){

        //standalone using api stub on NODEJS
        if(port === '8000'){
            configurationEndPoint = '/api/local';
        }//standalone UI app integrating with back end application on same machine, different port
        else{
          configurationEndPoint = '/services/env';
        }
      origin += configurationEndPoint;
   }else{
      throw Error('Unsupported Environment!!');
   }

   //load the configuration from a trusted resource and store it in local storage on start up
   $.get(origin,
    function( data ) {
         //load all configurations as key value pairs and store in localStorage for access. 
         configuration = data.configuration;
         for(var config in configuration){
             debugger;
             var objectProperty = localStorage + '.' + config.toString()
             objectProperty = configuration[config];
         }       
   }
);

}

可配置适配器

export default DS.RESTAdapter.extend({
host:       localStorage.host,
namespace:  localStorage.namespace

});

答案 1 :(得分:0)

不迟于昨天早上,我正在解决同样的问题。

基本上,您有两种选择:

  1. 使用localStorage / indexedDB或任何其他客户端持久存储。 (但你必须以某种方式把配置放在那里)。
  2. 渲染主模板(总是呈现的模板),隐藏在您放置配置JSON的位置。
  3. 然后在您的app init代码中,您将获得此配置并使用它。理论上简单明了,但让我们深入讨厌(第二种选择)。

    首先,客户端应该在应用程序加载之前获取配置。有时候并不容易。例如用户应该登录以查看配置。在我的情况下,我检查我是否可以在第一个请求上提供配置,如果没有将用户重定向到登录页面。这导致我们第二个限制。准备好提供配置后,您必须完全重新启动应用程序以便再次运行配置代码(至少在Angular中这是必要的,因为您无法在应用程序引导后访问提供程序)。

    另一个约束,如果您使用静态html,第二个选项是无用的,并且在发送到客户端之前无法以某种方式在服务器上更改它。

    可能更好的选择是结合两种变体。这应该可以解决返回用户的一些问题,但无论如何第一次互动都不会很愉快。我还没试过这个。