Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
如何将clojurescript编译为nodejs?_Clojure_Clojurescript - Fatal编程技术网

如何将clojurescript编译为nodejs?

如何将clojurescript编译为nodejs?,clojure,clojurescript,Clojure,Clojurescript,为什么cljsbuild不能正确编译gulpfile.js文件 这是我的project.cljconfig: (defproject cljs-selfstudy "0.1.0-SNAPSHOT" :description "Where I want to learn about clojurescript" :url "http://example.com" :dependencies [[org.clojure/clojure "1.7.0-alpha2"]

为什么
cljsbuild
不能正确编译
gulpfile.js
文件

这是我的
project.clj
config:

(defproject cljs-selfstudy "0.1.0-SNAPSHOT"
  :description "Where I want to learn about clojurescript"
  :url "http://example.com"

  :dependencies [[org.clojure/clojure "1.7.0-alpha2"]
                 [org.clojure/clojurescript "0.0-2322"]]

  :plugins [[lein-cljsbuild "1.0.4-SNAPSHOT"]]

  :source-paths ["src"]


  :cljsbuild {
              :builds [{:id "gulpjs"
                        :source-paths ["src/gulpjs"]
                        :compiler {
                                   :output-to "gulpfile.js"                                   
                                   :optimizations :none
                                   :pretty-print true}}]})
这是我的
core.cljs

(ns gulpjs.core
  (:require [cljs.nodejs :as node]))

(def gulp (node/require "gulp"))

(def gulp-livereload (node/require "gulp-livereload"))

(def gulp-markdown (node/require "gulp-markdown"))

(def gulp-watch (node/require "gulp-watch"))

(.task gulp "markdown" 
       #(-> (.source gulp "../markdown-explained")
            (.pipe (gulp-markdown))
            (.pipe (.dest gulp "build/markdown-explained"))))
这是我用来编译的命令

lein cljsbuild once gulpjs

Compiling ClojureScript.
Compiling "gulpfile.js" from ["src/gulpjs"]...
Successfully compiled "gulpfile.js" in 3.316 seconds.
但是我有一个奇怪的输出
gulpfile.js
,它看起来一点都不像节点代码,为什么它会如此错误

goog.addDependency("base.js", ['goog'], []);
goog.addDependency("../cljs/core.js", ['cljs.core'], ['goog.string', 'goog.object', 'goog.string.StringBuffer', 'goog.array']);
goog.addDependency("../cljs/nodejs.js", ['cljs.nodejs'], ['cljs.core']);
goog.addDependency("../gulpjs/core.js", ['gulpjs.core'], ['cljs.core', 'cljs.nodejs']);

发生这种情况是因为您正在使用
:optimization:none

此模式旨在通过快速重新编译进行主动开发。这样
cljsbuild
就可以只重新编译您更改的文件,而不涉及其他内容

如果要获取单个js文件,应使用以下任一选项:

:optimizations :simple
:optimizations :advanced
这将花费更多的时间,但会创建包含所有依赖项的单个文件

:高级
模式还将为您清除死代码,从而使目标文件更小。
但是您应该小心使用它,因为它有一些缺陷,因为闭包编译器的性质描述得很好。

因为您的目标是NodeJ,所以编译器选项中缺少的第一件事是

:target :nodejs
其次,如果您使用
:优化:无
,您也会缺少选项
输出目录

:output-dir "out"
下面是关于编译器选项和特性的一个很好的简介:(在幻灯片中往下看)

然后在主文件中,您需要设置一个main函数,最好启用控制台打印:

(ns cljs-gulp.core
  (:require [cljs.nodejs :as nodejs]))

(nodejs/enable-util-print!)

(defn -main [& args] ... )

(set! *main-cli-fn* -main)
然后,您实际上可以在nodejs中使用任何模式,但默认情况下工作的模式是
simple
advanced
。对于
none
您需要一个包装文件,使节点能够加载闭包依赖项,因此创建一个名为
index.js
的文件,例如,并将其放入:

require('./out/goog/bootstrap/nodejs')
require('./cljs_gulp') // Name of the js ouput file
require('./out/cljs_gulp/core') // Path to compiled core file
cljs_gulp.core._main() // appname.namespace._mainfunction
编译之后,您将使用
node index.js
而不是
node cljs_gulp.js
。这真是太棒了,你可以利用超快的重新编译时间

这篇文章很好地解释了这一切,而且是最近的:

下面是代码:(我的项目名是以cljs_gulp的形式生成的,所以请根据您的需要进行更改)

project.clj

(defproject cljs_gulp "0.1.0-SNAPSHOT"
  :description "Where I want to learn about clojurescript"
  :url "http://example.com"

  :dependencies [[org.clojure/clojure "1.7.0-alpha2"]
                 [org.clojure/clojurescript "0.0-2322"]]

  :plugins [[lein-cljsbuild "1.0.4-SNAPSHOT"]]

  :source-paths ["src"]

  :cljsbuild {
              :builds [{:id "gulpjs"
                        :source-paths ["src/cljs_gulp/"]
                        :compiler {
                                   :target :nodejs
                                   :output-to "cljs_gulp.js"
                                   :output-dir "out"
                                   :optimizations :none
                                   :pretty-print true}}]})
src/cljs_gulp/core.cljs

(ns cljs-gulp.core
  (:require [cljs.nodejs :as nodejs]))

(nodejs/enable-util-print!)

(def gulp (nodejs/require "gulp"))

(def gulp-livereload (nodejs/require "gulp-livereload"))

(def gulp-markdown (nodejs/require "gulp-markdown"))

(def gulp-watch (nodejs/require "gulp-watch"))

(defn -main [& args]
  (.task gulp "markdown"
         #(-> (.source gulp "../markdown-explained")
              (.pipe (gulp-markdown))
              (.pipe (.dest gulp "build/markdown-explained")))))

(set! *main-cli-fn* -main)
有两个cljs节点模板非常有助于开始使用cljs和节点,而不是浏览器:

  • (最近完成的一个)

如前面的回答中所述,ClojureScript被编译到浏览器中,默认情况下处于开发模式。为了确保它被编译为Node.js,您需要在配置中的某个地方指定
:target:nodejs

我想补充的是,
leincljs
并不是ClojureScript的唯一编译工具。如果您尝试,shadow cljs可能是一个更好的解决方案


此外,从ClojureScript编译的代码是用CloseJS编写的,它使用
goog.x.y.z
创建其模块系统。因此,您必须揭示这样一个事实:代码看起来远不像CommonJS。但是,如果您坚持,您可以使用shadow-cljs并指定
:target:commonjs

tks-bro,您的答案是正确的,但是@Joaquin-answer也更周到、更棒:)