如何获得简单的clojurescript编译的直接结果?

时间:2013-01-21 20:24:17

标签: testing clojure clojurescript cljsbuild

我希望能够在测试时将javascript代码注入我的应用程序。按照这种推理方式,我在重复中执行以下操作。

=> (cljs.closure/build '(swap! my-project.my-namespace.my-atom inc) {})
<= "goog.addDependency(\"base.js\", ['goog'], []);\ngoog.addDependency(\"../x8LL7.js\", [], []);"

然后我

=> more out/x8LL7.js 
<= cljs.core.swap_BANG_.call(null,my_project.my_namespace.my_atom,cljs.core.inc);

是的,似乎这就是我想要的。我可能会弄错,但我认为我不需要“base.js”依赖,因为它已经包含在正在测试的正在运行的应用程序中(使用:simple:optimizations)。

我的问题是,如何获取文件out/x8LL7.js的内容?我只想要写入out/x8LL7.js的字符串,因为我没有使用从cljs.closure/build返回的deps文件字符串。

如果不容易,那么我想我可以解析返回的deps字符串,自己打开文件然后使用内容;没有大碍。不过,我希望有更直接的方式。

3 个答案:

答案 0 :(得分:0)

更直接的方法是注入js代码(比如'var DEBUG = true;')然后从clojurescript引用它。注入clojurescript是有风险的,因为没有与js代码clojurescript编译的契约 - 你可以使用其他优化设置或clojurescript版本完全不同的代码。

答案 1 :(得分:0)

主要只是给自己留言,但是如果有人需要知道,这就是我如何快速修复它。

(def cljs-to-js-dir "_cljs_to_js_out")

(def js-options { :output-dir cljs-to-js-dir})

(defn js-compile [quoted-expr]
  (let [ result (cljs.closure/build quoted-expr js-options)
         file-name  ((re-find #"(/.+\.js)" result) 0)]
    (slurp (str  cljs-to-js-dir "/" file-name))))

(defmacro to-js [expr]
  (js-compile `((fn [] ~expr))))

使用此代码,您可以(从repl)输入:

=> (to-js (swap! my-project.my-namespace.my-atom inc))
<= "(function (){\nreturn cljs.core.swap_BANG_.call(null,my_project.my_namespace.my_atom,cljs.core.inc);\n}).call(null);\n"

我打赌你很好奇为什么我把expr(ession)包装在一个立即调用的无参数函数中。这是因为如果没有实际使用cljs.closure / build将优化远程代码。例如:

=> (js-compile '(fn [a b] (+ a b))) 
<= ""

然而

=> (js-compile '((fn [a b] (+ a b)) 2 3))
<= "(function (a,b){\nreturn (a + b);\n}).call(null,2,3);\n"

除了详细信息,(to-js)似乎做了我想做的事。

答案 2 :(得分:0)

您可以在cljs-in-cljs处尝试clojurescript.net的在线REPL:

首先启用调试模式:

cljs.user=> (set! webrepl/*debug* true)

现在,当您评估表单时,您将获得读取,分析(仅生成的表单)和发出的JS的结果:

cljs.user=> (def myatom (atom 1))
...
cljs.user=> (swap! myatom inc)
READ: (swap! myatom inc)
ANALYZED: (swap! myatom inc)
EMITTED: "cljs.core.swap_BANG_.call(null,cljs.user.myatom,cljs.core.inc)"
2

免责声明:我是cljs-in-cljs / clojurescript.net的创建者