将配置传递给 qooxdoo 应用程序的最佳实践
Best practices for passing configuration to a qooxdoo app
复杂的 qooxdoo(桌面)应用程序可能需要在启动时获取特定于部署的配置,例如:
- REST/WebSocket 后端 URL(可能与 script/document 位置不同);
- 品牌数据;
- enabled/disabled 特征;
- 性能调整
等等。目前,我们执行以下操作:
<head>
<script type="text/javascript">
config = {
key1: "foo",
key2: "bar",
key3: "<%= getParameter("myapp.key3") %>"
};
</script>
<script type="text/javascript" src="script/myapp.js"></script>
</head>
如您所见,它是一个 JSP,提供动态 config.key3
,以及静态 config.key1
和 config.key2
。我有点不喜欢这种方法,因为 1) config
顶级对象在 qooxdoo 应用程序代码中无法识别,这会导致编译器警告,2) 你可能会不小心弄乱另一个同名的顶级对象。谁能建议更好、更清洁的方法来做同样的事情?支持静态和动态配置的组合很重要。例如,开发人员将他的特定配置硬编码到某个 VCS 忽略的 JSON 文件中;生产环境提供来自数据库的配置数据; staging/QA 环境可以将这两个源用于配置的不同部分。
当然,问题不仅限于qooxdoo。我认为这对于可能需要特定于部署的自定义的任何独立 JavaScript 应用程序也是热门话题。
使用以下方法解决这两个问题(警告和顶级对象):
一个。在 index.html 加载应用程序的 JS 之前:
window.qx = { $$environment: {
"myapp.key1": "foo"
} };
b。稍后在您的 Qooxdoo 应用程序中
var key1 = qx.core.Environment.get("myapp.key1");
对于预定义的环境,我建议使用正常的 Qooxdoo 配置,而不是 @geonik 提供的 hack。以下是正常 config.json
:
的摘录
"config-warnings" :
{
"job-shadowing" : ["common", "source-script", "build-script"]
},
"jobs" :
{
"common" :
{
"environment" :
{
"appname.version" : "1.0.0",
"appname.timeout" : 30000,
"appname.analyticsId" : "UA..."
}
},
"source-script" :
{
"environment" :
{
"appname.serviceUrl" : "http://127.0.0.1:8080/service",
"appname.crossDomain" : true
}
},
"build-script" :
{
"environment" :
{
"appname.serviceUrl" : "/service",
"appname.crossDomain" : false
}
}
}
有了上面的内容,您在开发构建中有一个设置,在生产构建中有其他设置。您可以添加更多环境,例如 QA。与其他所需的设置。然后使用正常 qx.core.Environment.get
访问它们。
我不建议将运行时设置与本质上静态的 Qooxdoo 配置混合使用。只需以任何 qx.io.*
方式将它们加载到应用程序启动并在您的 类.
中处理
复杂的 qooxdoo(桌面)应用程序可能需要在启动时获取特定于部署的配置,例如:
- REST/WebSocket 后端 URL(可能与 script/document 位置不同);
- 品牌数据;
- enabled/disabled 特征;
- 性能调整
等等。目前,我们执行以下操作:
<head>
<script type="text/javascript">
config = {
key1: "foo",
key2: "bar",
key3: "<%= getParameter("myapp.key3") %>"
};
</script>
<script type="text/javascript" src="script/myapp.js"></script>
</head>
如您所见,它是一个 JSP,提供动态 config.key3
,以及静态 config.key1
和 config.key2
。我有点不喜欢这种方法,因为 1) config
顶级对象在 qooxdoo 应用程序代码中无法识别,这会导致编译器警告,2) 你可能会不小心弄乱另一个同名的顶级对象。谁能建议更好、更清洁的方法来做同样的事情?支持静态和动态配置的组合很重要。例如,开发人员将他的特定配置硬编码到某个 VCS 忽略的 JSON 文件中;生产环境提供来自数据库的配置数据; staging/QA 环境可以将这两个源用于配置的不同部分。
当然,问题不仅限于qooxdoo。我认为这对于可能需要特定于部署的自定义的任何独立 JavaScript 应用程序也是热门话题。
使用以下方法解决这两个问题(警告和顶级对象):
一个。在 index.html 加载应用程序的 JS 之前:
window.qx = { $$environment: {
"myapp.key1": "foo"
} };
b。稍后在您的 Qooxdoo 应用程序中
var key1 = qx.core.Environment.get("myapp.key1");
对于预定义的环境,我建议使用正常的 Qooxdoo 配置,而不是 @geonik 提供的 hack。以下是正常 config.json
:
"config-warnings" :
{
"job-shadowing" : ["common", "source-script", "build-script"]
},
"jobs" :
{
"common" :
{
"environment" :
{
"appname.version" : "1.0.0",
"appname.timeout" : 30000,
"appname.analyticsId" : "UA..."
}
},
"source-script" :
{
"environment" :
{
"appname.serviceUrl" : "http://127.0.0.1:8080/service",
"appname.crossDomain" : true
}
},
"build-script" :
{
"environment" :
{
"appname.serviceUrl" : "/service",
"appname.crossDomain" : false
}
}
}
有了上面的内容,您在开发构建中有一个设置,在生产构建中有其他设置。您可以添加更多环境,例如 QA。与其他所需的设置。然后使用正常 qx.core.Environment.get
访问它们。
我不建议将运行时设置与本质上静态的 Qooxdoo 配置混合使用。只需以任何 qx.io.*
方式将它们加载到应用程序启动并在您的 类.