【问题标题】:ClojureScript NodeJS Program Won't Accept Console ArgumentsClojureScript NodeJS 程序不接受控制台参数
【发布时间】:2016-01-06 19:30:30
【问题描述】:

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

【问题讨论】:

  • 通常你不会缩小 node.js 的代码。无论如何,这是个好问题。
  • 等等——你不应该在定位 nodejs 时使用高级编译选项吗?为什么会这样?
  • 高级编译是为了减少生成的.js的大小,这在浏览器中非常重要,因为它会在页面加载时下载,但在服务器端几乎没有用处
  • 我想,除了减小 .js 的大小之外,它对性能的提升也非同小可?
  • @user1770201 对节点执行此操作的通常原因是混淆代码,而不是提高性能。

标签: node.js clojure clojurescript


【解决方案1】:

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

默认的外部文件是there。 您还可以看到使用此变量的示例there

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

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

【讨论】:

  • 感谢您的回答。我没有参与这场斗争(欲望学习/修补),但我只是在 :advanced 和 :simple 之间进行了编译比较,并在针对 nodejs 时使用 :advanced 选项看到了大约 200 毫秒的增益。由于我运行测试的程序是一个 CLI 实用程序,这对我来说似乎很重要。另一方面,不断更新 externs 文件使编写 ClojureScript 感觉就像编写 C++(缓慢地声明所有内容等)。不知道在这里怎么想。 :(
  • @user1770201 也没有股份 :) 出于好奇,从多少时间到多少时间(以及您的 CLI 应用程序大概有多大)?
  • ~1,000ms -> 800ms 是差异。大约 100 行 clojurescript 代码 + 100 左右行纯 JavaScript 互操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多