1

我希望能够在测试时将 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)。

我的问题是,我怎样才能得到文件的内容out/x8LL7.js?我只想要写入的字符串,out/x8LL7.js因为我对从cljs.closure/build.

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

4

3 回答 3

0

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

于 2013-01-22T00:22:18.973 回答
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)似乎做我想做的事。

于 2013-01-22T20:07:26.407 回答
0

您可以在 clojurescript.net 尝试cljs-in-cljs在线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 的创建者

于 2013-01-23T14:54:38.263 回答