【问题标题】:How do I get the direct result of a simple clojurescript compilation?如何获得简单的 clojurescript 编译的直接结果?
【发布时间】:2013-01-21 20:24:17
【问题描述】:

我希望能够在测试时将 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 文件字符串。

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

【问题讨论】:

    标签: testing clojure clojurescript cljsbuild


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      主要是给自己的一个便条,但如果有人需要知道,这是我快速修复它的方法。

      (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) 似乎在做我想做的事。

      【讨论】:

        【解决方案3】:

        您可以在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 的创建者

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          相关资源
          最近更新 更多