考虑以下琐碎的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优化足够了,使用它们就不需要额外的步骤,比如供应外部文件。