Node.js ClojureScript NodeJS项目赢得';不接受控制台参数

Node.js ClojureScript NodeJS项目赢得';不接受控制台参数,node.js,clojure,clojurescript,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*

考虑以下简单的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 = {};
此外,取出
节点
父对象并仅使用
过程
也可以修复它:

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

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

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

无论如何,您可以使用外部文件(如您所发现的),也可以使用
*main cli fn*

如下所述:

并使用以下选项进行编译:

cljsc src '{:optimizations :simple :pretty-print true :target :nodejs}' > lib/sample.js
默认的外部文件是。 您还可以看到使用此变量的示例

此外,刚刚编辑了以下内容:

注意:在Node.js下,几乎没有理由使用高级 优化。而高级优化确实适用于性能 与之相关的优化,这些现在在很大程度上被优化所消除 出现在现代JavaScript虚拟机中,如V8、SpiderMonkey、, 和JavaScriptCore。对于Node.js,:简单或:无优化 足够了,使用它们就不需要额外的步骤,比如 外部文件


通常不会缩小node.js的代码。无论如何,这是一个好问题。等等——在针对NodeJ时不应该使用高级编译选项?为什么会这样?高级编译是为了减少生成的.js的大小,这在浏览器中非常重要,因为它会在页面加载时下载,但在服务器端几乎没有用处。我认为,除了减少.js的大小之外,它极大地提高了性能?@user1770201对node来说,这样做通常是为了混淆代码,而不是为了提高性能。谢谢你的回答。我在这场战斗中没有利害关系(欲望学习/修补),但我只是在:advanced和:simple之间进行了编译比较,并看到在针对NodeJ时使用:advanced选项可以获得约200ms的增益。因为我运行测试的程序是一个CLI实用程序,所以对我来说,这一点很重要。另一方面,不断更新外部文件使书写CuluScript感觉像编写C++(慢慢声明一切等等)。不知道该怎么想(@user1770201也没有利害关系:)出于好奇,从多少时间到多少时间(你的CLI应用程序大概有多大)?~1000ms->800ms是区别。大约100行clojurescript代码+100行左右纯JavaScript互操作。
cljsc src '{:optimizations :simple :pretty-print true :target :nodejs}' > lib/sample.js