clojure - Clojurescript/Clojure 中服务器和客户端之间的代码共享

标签 clojure clojurescript

假设我想在客户端 *.cljs 和服务器端 *.clj 之间找出一些通用代码,例如各种数据结构和常见操作,我能做到吗?这样做有意义吗?

最佳答案

更新:从 clojure 1.7 开始,请查看 Clojure reader conditionals or cljc .我使用 cljc 非常成功地在服务器和浏览器之间共享了大量代码。

好问题!最近我也一直在思考这个问题,并编写了一些应用程序进行实验。

这是我的列表,列出了您可能想要分享的类型以及每种类型的优缺点:

  • 我的大多数客户端 cljs 文件都包含操作 dom 的代码。因此,与服务器
  • 共享任何内容是没有意义的。
  • 大多数服务器端的东西处理文件系统和数据库调用。我想您可能想从客户端调用数据库(特别是如果您使用的是支持 javascript 调用的 no-sql 数据库之一)。但是,即使那样,我觉得您应该选择从客户端调用 db 或从服务器调用 db,因此,共享 db 代码也没有多大意义。
  • 共享绝对有值(value)的一个领域是能够在客户端和服务器之间共享和传递 clojure 数据结构(列表、向量、集合等的嵌套组合)。无需转换为 json(或 xml)并返回。例如,能够来回传递 dom 的打嗝式表示非常方便。在 gwt 中,我使用 gilead 在客户端和服务器之间共享模型。但是,在 clojure 中,您可以简单地传递数据结构,因此实际上没有必要像在 gwt 中那样共享类定义。
  • 我觉得我需要更多试验的一个领域是在客户端和服务器之间共享状态。在我看来,有几种策略:在客户端(单页 ajax 类型应用程序)上存储状态或在服务器上存储状态(如传统的 jsp 应用程序)或两者的组合。也许负责更新状态(原子、引用、代理或其他)的代码可以共享,然后状态可以通过请求和响应来回传递以保持两层同步?到目前为止,简单地使用 REST 最佳实践编写服务器,然后将状态存储在客户端似乎工作得很好。但是我可以看到在客户端和服务器之间共享状态可能有什么好处。
  • 我还不需要共享常量和/或属性,但这可能是重用的好东西。如果您将所有应用程序的全局常量放在一个 clj 文件中,然后编写一个脚本以在编译 clojurescript 时将其复制到 cljs,则应该可以正常工作,并且可能会节省一些重复的代码。

  • 希望这些想法有用,我对其他人迄今为止发现的内容非常感兴趣!

    关于clojure - Clojurescript/Clojure 中服务器和客户端之间的代码共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830077/

    相关文章:

    clojure - 是否有一个在线工具可以自动缩进和格式化Clojure代码,就像有很多JSON一样?

    clojure - 如何在clojure中验证电子邮件

    clojure - ClojureScript 中 Java 的模式/引用等价物

    clojure - 如何构建一个阻塞的分块惰性序列?

    clojure - 如何确定clojure中nil的含义?

    java - Clojure:我可以使用什么正则表达式来检测多行字符串中一行的最后一个字符?

    clojure - 如何在 Clojure 中为记录中的字段设置默认值?

    protocols - 如何在 Clojurescript 中使用 deftype 实现关联结构

    clojure - 如何让 cljsbuild 在 uberjar 编译 clojure 应用程序之前运行?

    functional-programming - 我正在尝试为集合向量创建累加器函数。但我不断得到奇怪的结果