2016-01-06 39 views
4

考慮以下瑣碎clojurescript程序:ClojureScript計劃的NodeJS不會接受控制檯參數

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

(defn -main [& args] 
    (println "args: " args) 
    (let [one (first args) two (second args)] 
    (println "one: " one) 
    (println "two: " two))) 

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

問題:如果我編譯這個沒有優化,這個計劃按預期工作。例如:

$ node program.js 1 2 
=> args: (1, 2) 
    one: 1 
    two: 2 

如果我編譯程序與先進的優化,那麼我的程序無法識別參數:

$ node program.js 1 2 
=> args: nil 
    one: nil 
    two: nil 

可能是什麼造成的?

編輯:添加以下實習醫生似乎解決該問題:

var node = {}; 
node.process = {}; 
node.process.argv = {}; 

此外,取出node父對象,只是使用process還修復它:

var process = {}; 
process.argv = {}; 

我但我不確定自己甚至能理解我自己的解決方案。我猜在幕後clojurescript正在將node.process.argv傳遞給-main?

+1

通常你不會縮小node.js的代碼。無論如何,這是一個很好的問題。 – nha

+0

等待 - 靶向時的NodeJS你不應該使用先進的編譯選項?爲什麼會這樣? – George

+1

先進的編譯,以減少所產生的大小。js,這在瀏覽器中非常重要,因爲它將在頁面加載時下載,但在服務器端幾乎沒有用處 – DanLebrero

回答

3

正如我在評論中說,減少的Node.js代碼它不完全是通常的路徑,可能不會造成顯著的性能提升。我能想到的唯一有效理由是混淆代碼。

無論如何,你可以使用一個外部文件(如你發現了),或者你可以使用*main-cli-fn*

如下所述:http://www.matthewstump.com/misc/2012/06/04/writing-nodejs-modules-in-clojurescript/

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

(defn blargl 
    [] 
    (println "blargl!")) 

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

並編譯它具有以下選項:

cljsc src '{:optimizations :simple :pretty-print true :target :nodejs}' > lib/sample.js 

默認的extern文件是there。 您還可以看到正在使用there這個變量的一個例子。

此外,ClojureScript Wiki for Node.js剛剛被修改,以反映:

注:在Node.js的,沒有理由使用先進 優化。儘管高級優化的確適用了性能 相關的優化,但現在,這些優化現在已經在諸如V8,SpiderMonkey, 和JavaScriptCore等現代JavaScript虛擬機中提供的優化 大大減少了。對於Node.js,:簡單或:沒有任何優化 就足夠了,並且使用它們可以省去額外的步驟,例如提供externs文件的 。

+1

感謝您的回答。我在這場戰鬥中沒有興趣(慾望學習/修補),但我只是在高級和簡單之間進行了編譯比較,並且在定位nodejs時使用:advanced選項看到了〜200ms的增益。由於我運行測試的程序是一個CLI實用程序,這對我來說似乎不是微不足道的。另一方面,不斷更新externs文件使得編寫ClojureScript感覺像編寫C++(慢慢地聲明一切,等等)。不知道在這裏想什麼。 :( – George

+0

@ user1770201也沒有股份:)出於好奇,從多少時間到多少時間(以及您的CLI應用程序大致有多大)? – nha

+1

〜1000ms - > 800ms是差分。大約100行clojurescript代碼+ 100行左右的純JavaScript腳本。 – George