2013-01-21 29 views
1

我希望能够在测试时将JavaScript代码注入到我的应用程序中。遵循这一推理,我在repl中做了以下工作。如何获得简单的clojurescript编译的直接结果?

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

大部分只是给自己一个提示,但如果有人需要知道,这里是我如何快速修复它。

(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(分裂国家) 。这是因为如果没有实际使用,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)似乎做我想做的。

0

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

0

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

首先启用调试模式:

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

现在,当您EVAL一个表格,您将获得阅读的结果,分析(刚刚产生的形式)和所发射的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合cljs /clojurescript.net