Node.js 如何在编译时在构建.cljs时定义目标环境?
我想为browser和node.js环境编译Node.js 如何在编译时在构建.cljs时定义目标环境?,node.js,clojurescript,boot-clj,cljsbuild,Node.js,Clojurescript,Boot Clj,Cljsbuild,我想为browser和node.js环境编译.cljs文件,以获得服务器端渲染。据我所知,在编译时无法使用读取器宏条件定义cljs env,例如: #?(:clj ...) #?(:cljs ...) 所以,我不能轻易地告诉编译器在node.js env中处理类似于#?(:cljs node…)的内容 我在这里看到的第二个选择是开发一个宏文件,它将在编译时定义env。但是如何定义当前构建的目标是node.js?可能是,我可以通过某种方式将一些参数传递给编译器或获取:target编译器参数 以下
.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}}
我不知道有一个公共API来实现这一点。但是,您可以在宏中使用dynamic var来检查目标平台(即NodeJS vs browser),该平台在
:编译器选项中配置了:target
,并发出或抑制宏中包装的代码:
(defn-nodejs目标?
[]
(=:nodejs(进入@cljs.env/*compiler*[:options:target]))
(用于nodejs的宏代码)
[&正文]
(何时(节点目标?)
`(do~@body)))
(b)浏览器的宏代码
[&正文]
(如果不是(nodejs目标?)
`(do~@body)))
(nodejs代码)
(定义我的变量“为nodejs编译”)
(println“你好,来自nodejs”))
(浏览器代码)
(定义我的变量“为浏览器编译”)
(println“来自浏览器的您好”))
谢谢,这正是我想要的!但是我遇到的一个问题是:在ns
中需要。如何根据env要求名称空间?目前我认为唯一的方法是使用require
而不是从ns
宏,而是直接使用,这可能是一个问题,取决于CLJS编译器如何处理它。您可以尝试将:require
从ns
表单中移出,并将其移动到一个单独的(require…
)中,并将其包装在一个宏中,然后查看它是否工作。