ClojureScript

JavaScript ライブラリのプリプロセス

ClojureScript を使用すると、JavaScript ライブラリのカスタム変換ステップを追加できます。つまり、方言で記述されているか JavaScript 構文拡張機能を使用する JavaScript ライブラリをプロジェクトに含めることができます。目的のコード変換を実行するには、cljs.closure/js-transforms に一致する defmethod が外部ライブラリの :preprocess オプションに提供される必要があります。たとえば、次の方法で JSX を使用する JavaScript ライブラリを通常の React ファンクション呼び出しに変換できます。

(require '[cljs.build.api :as b]
         '[clojure.java.io :as io])
(refer 'cljs.closure :only '[js-transforms])
(import 'javax.script.ScriptEngineManager)

(defmethod js-transforms :jsx [ijs opts]
  (let [engine (doto (.getEngineByName (ScriptEngineManager.) "nashorn")
                 (.eval (io/reader (io/file "babel.min.js")))
                 (.put "input" (:source ijs)))]
    (assoc ijs :source
      (.eval engine (str "Babel.transform(input, {presets: ['react']}).code")))))

(b/build "src"
  {:main 'my-project.core
   :output-to "out/my_project.js"
   :output-dir "out"
   :foreign-libs [{:file "libs/example.js"
                   :provides ["my.example"]
                   :preprocess :jsx}]})

上記の例では、Nashorn を使用して babel-standalone の最小バージョンを読み込むことにより、Babel を使用して JavaScript コードを変換します。js-transforms メソッドは、IJavaScript プロトコルに一致するオブジェクトを取得して返します。オブジェクトは、:url:provides:requires、および :source などのキーを持つプレーンマップまたはレコードにすることができます。js-transforms に渡される 2 番目の引数は、コンパイラオプションを含むマップです。JavaScript のプリプロセスは