ClojureScript NodeJS程序不会接受控制台参数

考虑下面的clojurescript程序:

(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 

什么可能导致这个?

编辑:添加下面的externs似乎解决了这个问题:

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

另外,取出node父对象并使用process也会修复它:

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

虽然我不太清楚自己的解决scheme。 我猜在幕后clojurescript正在传递node.process.argv到-main?

正如我在评论中所说的那样,最小化Node.JS的代码并不是正常的path,并且可能不会导致显着的性能改进。 我能想到的唯一有效的原因是混淆了代码。

无论如何,你可以使用一个外部文件(如你所知),或者你可以使用*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文件就在那里 。 你也可以看到这个variables的例子。

此外, Node.js的ClojureScript Wiki刚刚进行了编辑,以反映:

注意:在Node.js下,没有什么理由使用高级优化。 尽pipe高级优化确实会应用与性能相关的优化,但现在,这些优化大部分可以通过现代JavaScript虚拟机(如V8,SpiderMonkey和JavaScriptCore)中的优化来消除。 对于Node.js,:简单的或者:没有任何优化就足够了,使用它们就不需要额外的步骤,比如提供extern文件。