我想为浏览器和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}}
答案 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"))