如何将clojurescript编译为nodejs?

bab*_*gau 9 clojure clojurescript

为什么cljsbuildgulpfile.js正确编译文件?

这是我的project.clj配置:

(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}}]})
Run Code Online (Sandbox Code Playgroud)

这是我的 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"))))
Run Code Online (Sandbox Code Playgroud)

这是我用来编译的命令

lein cljsbuild once gulpjs

Compiling ClojureScript.
Compiling "gulpfile.js" from ["src/gulpjs"]...
Successfully compiled "gulpfile.js" in 3.316 seconds.
Run Code Online (Sandbox Code Playgroud)

但我有这个奇怪的输出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']);
Run Code Online (Sandbox Code Playgroud)

Joa*_*uin 11

由于您的目标是nodejs,因此编译器选项中缺少的第一件事就是

:target :nodejs
Run Code Online (Sandbox Code Playgroud)

其次,如果您使用,:optimizations :none您也会错过选项output-dir:

:output-dir "out"
Run Code Online (Sandbox Code Playgroud)

以下是关于编译器选项和特性的简要介绍:http://slides.com/joakino/diving-into-clojurescript/#/5(在幻灯片中下载)

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

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

(nodejs/enable-util-print!)

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

(set! *main-cli-fn* -main)
Run Code Online (Sandbox Code Playgroud)

然后,您实际上可以在nodejs中使用任何模式,但默认情况下工作的模式是simpleadvanced.因为none你需要一个包装器文件来使节点能够加载闭包依赖,所以创建一个名为index.jsexample 的文件并将其放入:

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
Run Code Online (Sandbox Code Playgroud)

编译后你会node index.js改为node cljs_gulp.js.这很棒,你可以利用超快的重新编译时间.

这篇文章很好地解释了它,它是最近的:http://blog.lauripesonen.com/clojurescript-optimizations-on-node-huh/

这是代码:(我的项目名称生成为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}}]})
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

有几个cljs节点模板非常有助于开始使用cljs和节点,而不是浏览器: