使用Backbone.JS在服务器和客户端之间共享常量的最佳实践
Best practices for shared constants between server and client using Backbone.JS
使用Backbone.JS处理服务器代码和客户端代码之间共享常量的最佳方法是什么?例如,假设我有这样的用户角色映射:
user_roles = {
1 => "member",
2 => "moderator",
3 => "admin"}
显然,如果您在客户端和服务器端代码中重复这些定义,这将不能很好地扩展并且容易出错。
我能想到的解决方案是简单地将这些定义公开为主干。集合或主干。建模并从服务器获取它们,但是如果你有大量的常量类型,这可能会导致不必要的开销,而且我不确定它们是否真的属于模型。
解决这个问题的不同解决方案是什么,它们的可扩展性如何?
我已经尝试了几种不同的方法来处理这个问题。我不知道这两种方法是不是最好的方法,但是这两种方法对我来说都很有效,所以我将在这里描述它们,希望它们能对你有所帮助。
两者的核心概念是相同的:常量在服务器端语言(在我的例子中是c#和Java)中定义为true常量,并将其转换为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
。
我发现这是一个更好的选择,但如果客户端和服务器开发不是同步完成的(一起构建,一起发布),依赖关系管理可能会变得相当混乱。在我的例子中,我总是将客户机和服务器部署在一起,所以这样做效果很好。
如果你的后端不是JavaScript,用你的常量生成一个JavaScript或JSON文件,然后将它们包含在你的客户端构建或注入到你的初始HTML模板中。我有时会在Django配置设置中这样做,或者在yaml文件中这样做:yaml -> python, yaml -> js或者只是JSON。
我不知道为常量添加所有额外的主干模型逻辑是否有意义。
另一方面,这是我喜欢meteor.js的一个很好的理由。完全使这种事情不必担心,因为您可以轻松地在服务器和客户端之间共享常量。:)
- Facebook共享显示一个接一个的空白页面
- 通过javascript/html访问twitter共享iframe
- 在我的SPA应用程序中集成Facebook共享的问题
- 在索引.html和应用.js [node.js] 之间共享变量
- AngularJS:$q.dedefe()不能由工厂方法共享
- 使用闭包共享构造函数参数
- Facebook共享动态参数链接
- Node.js上的WebSocket,并在所有连接的客户端之间共享消息
- Javascript-在哪里放置常量,全局或本地
- 如何在没有插件和Wordpress的情况下创建共享社交媒体
- 在requirejs中共享实例化对象
- 在Javascript服务器/客户端中共享对象定义
- JavaScript常量-作为参数传递或直接使用
- 使用服务(AngularJS)在控制器之间共享数据
- 我可以共享一个HTML播放器吗
- StrutsJava和Javascript之间共享常量
- 在rails模型和angularjs控制器之间共享一个常量变量
- asp.net mvc 3-在mvc Razor中共享C#和Javascript之间的常量
- 如何在Angularjs中创建这个全局常量,以便在控制器之间共享
- 使用Backbone.JS在服务器和客户端之间共享常量的最佳实践