我希望能够在测试时将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字符串,自己打开文件然后使用内容;没有大碍。不过,我希望有更直接的方式。
答案 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的创建者