2014-09-12 12 views
9

Perché cljsbuild non compila correttamente il file gulpfile.js?Come compilare clojurescript in nodejs?

Ecco la mia 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}}]}) 

Ecco il mio 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")))) 

Qui è il comando che ho usato per compilare

lein cljsbuild once gulpjs 

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

ma ho questo strano uscita gulpfile.js, non sembra affatto un codice nodo, perché è così sbagliato???

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']); 

risposta

11

Dal momento che si prendono di mira nodejs, la prima cosa che ti manca nelle opzioni del compilatore è

:target :nodejs 

In secondo luogo, se si utilizza :optimizations :none ti manca troppo l'opzione output-dir:

:output-dir "out" 

Qui è un bel briefing sulle opzioni e le caratteristiche del compilatore: http://slides.com/joakino/diving-into-clojurescript/#/5 (Vai giù nelle diapositive)

Poi io n il file principale, è necessario impostare una funzione principale ed è bello per consentire stampe console:

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

(nodejs/enable-util-print!) 

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

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

Poi, si può effettivamente utilizzare qualsiasi modalità in nodejs, ma quelli che funzionano per default sono simple e advanced . Per none è necessario un file wrapper per rendere il nodo essere in grado di caricare le dipendenze di chiusura, in modo da creare un file denominato index.js per esempio e mettere questo in:

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 

E dopo la compilazione si farebbe node index.js invece di node cljs_gulp.js. E questo funziona benissimo e tu approfitti dei tempi di ricompilazione super veloci.

Questo articolo spiega tutto abbastanza bene, ed è recente: http://blog.lauripesonen.com/clojurescript-optimizations-on-node-huh/

Ecco il codice: (il mio nome del progetto è stato generato come cljs_gulp, in modo da cambiare la situazione per adattarsi vostro)

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) 

Ci sono un paio di modelli di nodo cljs che sono molto utili per iniziare a cljs e nodo, invece del browser:

3

Questo succede perché si sta usando :optimization :none.

Questa modalità è destinata allo sviluppo attivo con una rapida ricompilazione. In questo modo, cljsbuild potrebbe ricompilare solo il file che hai modificato senza toccare altre cose.

Se si desidera ottenere un unico file js, è necessario utilizzare uno dei seguenti:

:optimizations :simple 
:optimizations :advanced 

questo richiederà molto più tempo ma crea un unico file con tutte le dipendenze incluse.

:advanced la modalità pulirà anche il codice guasto per voi, rendendo così il file di destinazione ancora più piccolo. Ma dovresti stare attento ad usarlo, a causa di alcuni problemi dovuti alla natura del compilatore di chiusura ben descritto in this article.

+0

tks bro, la risposta è corretta ma la risposta @Joaquin è più riflessiva e ottima :) – babygau