15

使用 Backbone.JS 处理服务器代码和客户端代码之间共享常量的最佳方法是什么?例如,假设我有这张用户角色地图:

user_roles = {
  1 => "member", 
  2 => "moderator", 
  3 => "admin"}

显然,如果您在客户端和服务器端的代码中复制这些定义,这将不能很好地扩展并且容易出错。

我能想出的解决方案只是将这些定义公开为 Backbone.Collection 或 Backbone.Model 并从服务器获取它们,但是如果您有大量常量类型,这可能会导致不必要的开销,我不确定它们是否真的属于模型内部。

解决这个问题有哪些不同的解决方案,它们的规模如何?

4

2 回答 2

17

我尝试了几种不同的方法来处理这个问题。我不知道它们中的任何一个是否是最好的方法,但它们都对我来说效果很好,所以我将在这里描述它们,希望它们对我有所帮助。

两者的核心概念是相同的:常量在服务器端语言(在我的例子中是 C# 和 Java)中被定义为真正的常量,并且为了客户端的利益被转换为 JSON 或 javascript。我认为这是要走的路,而不是共享单个 JSON/YML/等。配置文件。仅仅因为 javascript 没有真正的常量并不意味着你的服务器也不应该有它们。

选项 1:通过 Web 服务调用在运行时加载常量和枚举。

创建一个服务端点(我们称之为/enums),它基本上将所有服务器端枚举和常量收集到一大堆 JSON 中。为了避免额外的服务调用,如果您还使用一些服务器端模板框架,您可以将其引导到您的index.html.

如果您不想将任何内容引导到静态内容,则可以进行其他优化。由于常量很少更改,因此您可以将/enums响应包装到包含服务器应用程序构建版本的包装器对象中。例如:

{
  "version": "1.2.1.0",
  "enums": { ... }
}

当用户第一次点击页面时,请求GET /enums,并将整个响应存储到浏览器的本地存储中。在随后的访问中,从本地存储中读取常量并使用GET /enums?v=1.2.1.0. 服务器应该将它的版本与传递的版本进行比较,如果它们相同,它只会返回HTTP 200 OK以向客户端表明它的枚举仍然有效。

如果您在前端和后端开发人员使用不同工具或通常不紧密合作的分布式环境中工作,则此选项非常有用。

选项 2:在构建过程中共享常量

您可以使用文本转换模板(例如T4)从服务器端语言源生成 javascript 代码。就我而言,这是 C#。

我将所有服务器端枚举存储在一个目录中,并运行了一个构建任务,该任务将该目录中的所有 C# 源文件转换为 javascript 对象,并将它们组合成enums.js客户端源树中的一个文件。

我发现这是一个更可取的选择,但是如果客户端和服务器开发没有同步完成(一起构建,一起发布),依赖管理可能会变得非常混乱。就我而言,我总是将客户端和服务器都部署在一起,所以效果很好。

于 2013-01-07T21:18:49.340 回答
1

如果您的后端不在 JavaScript 中,请使用您的常量生成一个 JavaScript 或 JSON 文件,然后将其包含在客户端构建中或将它们注入到您的初始 HTML 模板中。我有时会使用 Django 配置设置或使用 yaml 文件中的设置来执行此操作:yaml -> python、yaml -> js 或只是 JSON。

我不知道为常量使用所有额外的主干模型逻辑是否有意义。

另一方面,这是我喜欢meteor.js 的一个很好的理由。完全不用担心这种事情,因为您可以轻松地在服务器和客户端之间共享常量。:)

于 2013-01-06T21:45:45.003 回答