ClojureScript

JavaScript 库预处理

ClojureScript 允许您为 JavaScript 库添加自定义转换步骤。这意味着您可以将使用方言或 JavaScript 语法扩展编写的 JavaScript 库包含在您的项目中。为了实现所需的代码转换,必须为外部库的 `:preprocess` 选项提供满足 `cljs.closure/js-transforms` 的 `defmethod`。例如,您可以使用 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}]})

上面的示例使用 Babel 通过使用 Nashorn 加载 babel-standalone 的最小化版本来转换 JavaScript 代码。`js-transforms` 方法获取并返回满足 `IJavaScript` 协议的对象。该对象可以是简单的映射或带有 `:url`、`:provides`、`:requires` 和 `:source` 等键的记录。传递给 `js-transforms` 的第二个参数是包含编译器选项的映射。JavaScript 预处理发生在 模块转换 之前,但是,这两个步骤彼此独立,并且可以并列使用。