说我想排除客户端* .cljs和服务器端* .clj之间的一些通用代码,例如各种数据结构和通用操作,我可以这样做吗?这样做有意义吗?

有帮助吗?

解决方案

更新:从clojure 1.7开始,请查看 Clojure读取器有条件或cljc 。我已经成功使用cljc在服务器和浏览器之间轻松共享了许多代码。

好问题!最近,我也对此进行了很多思考,并编写了一些应用程序进行实验。

这是我列出的您可能希望共享的类型以及每种类型的利弊的列表:

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

    希望这些想法有用,我对到目前为止其他人发现的东西非常感兴趣!

其他提示

我编写了 cljx Leiningen插件,专门用于处理Clojure数据可视化库的Clojure / ClojureScript代码共享。。 95%的非主机互操作代码看起来相同,cljx允许您通过使用core.logic指定重写规则来自动重写最后5%的代码。 但是,在大多数情况下,它是简单的符号替换。例如,Clojure中的clojure.lang.IFn就是ClojureScript中的IFn

在为特定平台生成代码时,您还可以使用元数据来注释要包含或排除的表单。

Leiningen的新 lein-cljsbuild 插件已内置支持,用于共享纯Clojure代码。

快速编写一些代码,将服务器clojure代码的一部分复制到clojurescript代码中,并在构建之前将其重命名为.cljs: 通用标签

这个问题早于cljc,但是由于偶然发现,我想我会提到Clojure 阅读器条件

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top