ClojureScript

JavaScript 函式庫預處理

ClojureScript 允許您為 JavaScript 函式庫新增自訂的轉換步驟。這表示您可以在專案中包含以其他方言編寫或使用 JavaScript 語法擴充的 JavaScript 函式庫。為了實現所需的程式碼轉換,必須提供滿足 cljs.closure/js-transformsdefmethod 給外部函式庫的 :preprocess 選項。例如,您可以如下使用 Babel 將 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}]})

上面的範例使用 Babel,透過使用 Nashorn 載入 babel-standalone 的縮小版本來轉換 JavaScript 程式碼。js-transforms 方法會取得並傳回滿足 IJavaScript 協定的物件。該物件可以是普通的 map 或具有 :url:provides:requires:source 等鍵的 record。傳遞給 js-transforms 的第二個引數是帶有編譯器選項的 map。JavaScript 預處理發生在 模組轉換 之前,然而,這兩個步驟彼此獨立,可以分開使用。