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

时间:2016-01-06 19:30:31

标签: node.js clojure clojurescript

考虑以下简单的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

导致这种情况的原因是什么?

编辑:添加以下外部设备似乎解决了这个问题:

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

此外,取出node父对象并使用process也可以修复它:

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

我不确定我是否理解自己的解决方案。我猜幕后的clojurescript是将node.process.argv传递给-main?

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,最小化Node.JS代码并不完全是通常的路径,并且可能不会导致显着的性能改进。我能想到的唯一有效理由是混淆代码。

无论如何,你可以使用extern文件(如你所知),或者你可以使用*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下,几乎没有理由使用高级版   优化。虽然高级优化确实可以应用性能   相关的优化,现在很大程度上避免了这些优化   出现在现代JavaScript虚拟机中,如V8,SpiderMonkey,   和JavaScriptCore。对于Node.js,:simple或:none optimizations   足够和使用它们消除了提供额外步骤的需要   外部文件。