Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在编译时在构建.cljs时定义目标环境?_Node.js_Clojurescript_Boot Clj_Cljsbuild - Fatal编程技术网

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

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编译器参数 以下

我想为browser和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}}

我不知道有一个公共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…
)中,并将其包装在一个宏中,然后查看它是否工作。