我尝试了几种不同的方法来处理这个问题。我不知道它们中的任何一个是否是最好的方法,但它们都对我来说效果很好,所以我将在这里描述它们,希望它们对我有所帮助。
两者的核心概念是相同的:常量在服务器端语言(在我的例子中是 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
客户端源树中的一个文件。
我发现这是一个更可取的选择,但是如果客户端和服务器开发没有同步完成(一起构建,一起发布),依赖管理可能会变得非常混乱。就我而言,我总是将客户端和服务器都部署在一起,所以效果很好。