1

テスト中に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から返されるdepsファイルの文字列は使用できないため、書き込まれる文字列が必要です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 に答える