如何在构建.cljs时在编译时定义目标环境?

时间:2017-11-25 06:18:36

标签: node.js clojurescript boot-clj cljsbuild

我想为浏览器和node.js环境编译我的.cljs文件,以获得服务器端呈现。据我了解,在编译时使用读取器宏条件无法定义cljs env:

#?(:clj ...)
#?(:cljs ...)

所以,我不能轻易告诉编译器在node.js env中处理类似#?(:cljs-node ...)的内容。

我在这里看到的第二个选项是开发一个宏文件,它将在编译时定义env。但是如何定义当前版本的目标是node.js?可能是,我可以以某种方式将某些参数传递给编译器或获取:target编译器参数?

以下是我的启动文件:

application.cljs.edn:

{:require  [filemporium.client.core]
 :init-fns [filemporium.client.core/init]} 

application.node.cljs.edn:

{:require [filemporium.ssr.core]
 :init-fns [filemporium.ssr.core/-main]
 :compiler-options
 {:preamble ["include.js"]
  :target :nodejs
  :optimizations :simple}}

1 个答案:

答案 0 :(得分:1)

我不知道有一个公共API来实现这个目标。但是,您可以在宏中使用cljs.env/*compiler* dynamic var来检查:target中配置了:compiler-options的目标平台(即NodeJS与浏览器),并发出或取消包含在其中的代码宏:

(defn- nodejs-target?
  []
  (= :nodejs (get-in @cljs.env/*compiler* [:options :target])))

(defmacro code-for-nodejs
  [& body]
  (when (nodejs-target?)
    `(do ~@body)))

(defmacro code-for-browser
  [& body]
  (when-not (nodejs-target?)
    `(do ~@body)))

(code-for-nodejs
  (def my-variable "Compiled for nodejs")
  (println "Hello from nodejs"))

(code-for-browser
  (def my-variable "Compiled for browser")
  (println "Hello from browser"))