构建 .cljs 时如何在编译时定义目标环境?
How to define target env in compile time while building .cljs?
我想为浏览器和 node.js 环境编译我的 .cljs
文件,以获得服务器端呈现。据我了解,无法在编译时使用 reader 宏条件定义 cljs env,例如:
#?(:clj ...)
#?(:cljs ...)
所以,我不能轻易地告诉编译器在 node.js 环境中处理类似 #?(:cljs-node ...)
的东西。
我在这里看到的第二个选项是开发一个在编译时定义环境的宏文件。但是如何定义当前构建的目标是 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}}
我不知道 public API 可以实现此目的。但是,您可以在宏中使用 cljs.env/*compiler*
动态变量来检查在 :compiler-options
中配置了 :target
的目标平台(即 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"))
我想为浏览器和 node.js 环境编译我的 .cljs
文件,以获得服务器端呈现。据我了解,无法在编译时使用 reader 宏条件定义 cljs env,例如:
#?(:clj ...)
#?(:cljs ...)
所以,我不能轻易地告诉编译器在 node.js 环境中处理类似 #?(:cljs-node ...)
的东西。
我在这里看到的第二个选项是开发一个在编译时定义环境的宏文件。但是如何定义当前构建的目标是 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}}
我不知道 public API 可以实现此目的。但是,您可以在宏中使用 cljs.env/*compiler*
动态变量来检查在 :compiler-options
中配置了 :target
的目标平台(即 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"))