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

Testing 如何获得简单clojurescript编译的直接结果?,testing,clojure,clojurescript,cljsbuild,Testing,Clojure,Clojurescript,Cljsbuild,我希望能够在测试时将javascript代码注入到我的应用程序中。按照这条推理路线,我在repl中执行以下操作 => (cljs.closure/build '(swap! my-project.my-namespace.my-atom inc) {}) <= "goog.addDependency(\"base.js\", ['goog'], []);\ngoog.addDependency(\"../x8LL7.js\", [], []);" 我那么 => more ou

我希望能够在测试时将javascript代码注入到我的应用程序中。按照这条推理路线,我在repl中执行以下操作

=> (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

我的问题是,如何将文件/x8LL7.js的内容导出?我只想要写入out/x8LL7.js的字符串,因为我不需要从cljs.closure/build返回的deps文件字符串


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

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

主要是给我自己留个便条,但万一有人需要知道,下面是我如何快速修复它的

(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"
我敢打赌,您一定很好奇为什么我将表达式包装在一个立即调用的无参数函数中。这是因为如果没有实际使用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似乎满足了我的要求。

您可以在以下网址尝试在线回复:

首先启用调试模式:

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/clojurescript.net中cljs的创建者