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



考虑以下琐碎的clojudescript程序:

(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.prrocess.argv传递给-main吗?

正如我在评论中所说,最小化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

默认的外部文件就在那里。您还可以在那里看到一个使用该变量的示例。

此外,Node.js的ClojureScript Wiki刚刚被编辑以反映这一点:

注意:在Node.js下,没有什么理由使用高级优化。虽然高级优化确实应用了性能相关的优化,现在通过优化在很大程度上消除了这些问题存在于诸如V8、SpiderMonkey等现代JavaScript虚拟机中,和JavaScriptCore。对于Node.js,:simple或:none优化足够了,使用它们就不需要额外的步骤,比如供应外部文件。

最新更新