说我想在我的客户端* .cljs和我的服务器端* .clj之间分解一些常用代码,例如:各种数据结构和常见操作,我可以这样做吗?这样做有意义吗?
答案 0 :(得分:15)
我专门编写了cljx Leiningen插件来处理Clojure数据可视化库的Clojure / ClojureScript代码共享。
95%的非主机间互操作代码看起来相同,而cljx允许您通过使用core.logic指定重写规则来自动重写最后5%。
但大多数时候,这是简单的符号替换;例如,Clojure中的clojure.lang.IFn
只是ClojureScript中的IFn
。
在为特定平台生成代码时,您还可以使用元数据来注释要包含或排除的表单。
答案 1 :(得分:12)
更新:截至clojure 1.7,请查看Clojure reader conditionals or cljc。我已经非常成功地使用cljc在服务器和浏览器之间共享很多代码。
好问题!我最近一直在考虑这个问题,并编写了一些应用程序来进行实验。
以下列出了您可能希望分享的内容以及每种内容的优缺点:
希望这些想法很有用,我对其他人到目前为止所发现的内容非常感兴趣!
答案 2 :(得分:10)
Leiningen的新lein-cljsbuild插件内置support,用于共享纯Clojure代码。
答案 3 :(得分:2)
写了一小段代码,将我的服务器clojure代码的一部分复制到我的clojurescript代码,在构建之前重命名为.cljs:
(ns clj-cljs.build
(use
[clojure.java.io]
)
(require
[cljs.closure :as cljsc]
)
)
(defn list-files [path]
(.listFiles (as-file path))
)
(defn copy-file* [from to]
;(println " coping " from " to " to)
(make-parents to)
(copy from to)
)
(defn rename [to-path common-path f]
(str to-path common-path (.replaceAll (.getName f) ".clj" ".cljs"))
)
(defn clj-cljs* [files common-path to-path]
(doseq [i (filter #(.endsWith (.getName %) ".clj") files)]
(copy-file* i (file (rename to-path common-path i)))
)
(doseq [i (filter #(.isDirectory %) files)]
(clj-cljs* (list-files i) (str common-path (.getName i) "/") to-path)
)
)
(defn build [{:keys [common-path clj-path cljs-path js-path module-name]}]
(clj-cljs* (list-files (str clj-path common-path)) common-path cljs-path)
(cljsc/build
cljs-path
{
:output-dir js-path
:output-to (str js-path module-name ".js")
}
)
)
(defn build-default []
(build
{
:clj-path "/home/user/projects/example/code/src/main/clojure/"
:cljs-path "/home/user/projects/example/code/src/main/cljs/"
:js-path "/home/user/projects/example/code/public/js/cljs/"
:common-path "example/common/" ; the root of your common server-client code
:module-name "example"
}
)
)
答案 4 :(得分:0)
这个问题早于cljc
,但由于我偶然发现它,我想我会提到Clojure reader conditionals。