首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将文本编译成nodejs?

如何将文本编译成nodejs?
EN

Stack Overflow用户
提问于 2014-09-12 07:55:18
回答 3查看 4.4K关注 0票数 9

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

下面是我的project.clj配置:

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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"))))

下面是我用来编译的命令

代码语言:javascript
复制
lein cljsbuild once gulpjs

Compiling ClojureScript.
Compiling "gulpfile.js" from ["src/gulpjs"]...
Successfully compiled "gulpfile.js" in 3.316 seconds.

但是我有一个奇怪的输出gulpfile.js,它看起来一点都不像节点代码,为什么它是如此错误?

代码语言:javascript
复制
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']);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-12 09:39:30

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

代码语言:javascript
复制
:target :nodejs

第二,如果您使用:optimizations :none,您也缺少了选项output-dir

代码语言:javascript
复制
:output-dir "out"

下面是一个关于编译器选项和特性的很好的简报:http://slides.com/joakino/diving-into-clojurescript/#/5 (在幻灯片中)

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

代码语言:javascript
复制
(ns cljs-gulp.core
  (:require [cljs.nodejs :as nodejs]))

(nodejs/enable-util-print!)

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

(set! *main-cli-fn* -main)

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

代码语言:javascript
复制
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。这是很棒的,你可以利用超快的重新编译时间。

本文很好地解释了这一切,并且是最近的:http://blog.lauripesonen.com/clojurescript-optimizations-on-node-huh/

下面是代码:(我的项目名是以cljs_gulp的形式生成的,因此更改它以适合您的项目名称)

project.clj

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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和节点非常有帮助,而不是浏览器:

票数 12
EN

Stack Overflow用户

发布于 2014-09-12 08:56:26

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

这种模式的目的是积极发展,快速重新编译。这样,cljsbuild就可以只重新编译您更改的文件,而不涉及其他内容。

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

代码语言:javascript
复制
:optimizations :simple
:optimizations :advanced

这将花费更多的时间,但创建一个包含所有依赖项的单一文件。

:advanced模式还将为您清除死代码,从而使目标文件更小。但是您应该小心使用它,因为闭包编译器很好地描述了在本文中,因此它存在一些缺陷。

票数 3
EN

Stack Overflow用户

发布于 2018-06-30 16:53:11

正如前面的答案所提到的,默认情况下,ClojureScript被编译为浏览器和开发模式。为了确保它被编译成Node.js,您需要在配置中的某个位置指定:target :nodejs

我想补充一点,lein-cljs不是ClojureScript的唯一编译器工具。如果您尝试https://github.com/minimal-xyz/minimal-shadow-cljs-nodejs,影子cljs可能是一个更好的解决方案。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25803420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档