请在 2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面了解如何使用本网站的相关信息。

0
ClojureScript
已安装 graal


$ java -version
openjdk 版本 "1.8.0_212"
OpenJDK 运行时环境(构建 1.8.0_212-20190420112649.buildslave.jdk8u-src-tar--b03)
OpenJDK GraalVM CE 19.0.0(构建 25.212-b03-jvmci-19-b01,混合模式)



$ clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"}}}' -m cljs.main -re graaljs
ClojureScript 1.10.520
cljs.user=> (ns com.foo)

com.foo=> (defn bar [])
#'com.foo/bar
com.foo=> (bar)
执行错误(错误)在 (<cljs repl>:1)。
(中间值).foo.bar.call 不是一个函数

17 个答案

0

评论人:kommen

GraalJS 问题: https://github.com/graalvm/graaljs/issues/164

0

评论人:mfikes

让我想起了 CLJS-2770

0
_评论人:mfikes_

我想知道将 {{js.java-package-globals}} 设置为禁用它们是否足以解决此问题,或者这会不会引入其他问题。


执行以下命令:$ clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"}}}' -m cljs.main -re graaljs -ro '{"js.java-package-globals" "false"}' -r
ClojureScript 1.10.520
cljs.user=> (ns com.foo)

com.foo=> (defn bar [])
#'com.foo/bar
com.foo=> (bar)
nil


有关详细信息,请参阅https://script.clojure.org/reference/repl-options#_graal_js_repl_options
0

评论人:kommen

使用 {{js.java-package-globals}} 也可以解决这个问题。因为提供了更多的“顶级域名”(如 Packages, java, javafx, javax, com, org, edu),这将修复这些域名的使用。正如 Mike 指出的,这将导致破坏性变更,如果有人在 graal 环境中依赖这些全局变量。

0

评论人:kommen

CLJS-3087-2.patch 默认关闭 java 包全局变量。

我更倾向于与其他 JS 引擎兼容,以及在 graaljs 上运行的 Clojure 和 ClojureScript 之间的兼容性,而不是使用 java 包全局变量作为快捷方式。该功能仍然可以通过 {{Java.type}} 实现,如(链接:https://github.com/clojure/clojurescript/blob/3a0c07477ae781bf521bdc2b074ed7b783bb93f3/src/main/cljs/cljs/bootstrap_graaljs.js#L4 文本:graaljs_load)。

0

评论人:mfikes

尽管这严格来说是一个破坏性变更,但 GraalJS 上市时间还不长,因此这种变更不太可能破坏任何人。如果确实如此,可以覆盖默认设置。

(链接:~kommen) 您已指出您在这里看到了 Java 包的使用:https://github.com/clojure/clojurescript/blob/master/src/main/clojure/cljs/closure.clj#L1672-L1676

我没有检查,如果我们修改默认设置,它们是否会受到影响?

0

评论人:kommen

(链接:~mfikes) 就我所知,更改默认选项不会影响这些,因为创建的默认 GraalJS 引擎不会用于运行 {{output-main-file}} 产生的工件。但我会仍然建议将那些使用改为使用 {{Java.type}} (取决于与 Nashorn 的兼容性),这样,即使关闭了 {{js.java-package-globals}},也能使用 GraalJS 的 {{js}} 命令行工具,同时主文件仍然可用。

0

评论人:mfikes

CLJS-3087-2.patch 通过 CI 测试 (//)

0

评论人:mfikes

CLJS-3087-2.patch 添加到 Patch Tender (i)

0

评论人:mfikes

CLJS-3087-2.patch 已获同意 (y)

0

评论人:kommen

在(github链接:https://github.com/graalvm/graaljs/issues/164 文本:graaljs问题)中,他们不打算更改{{js.java-package-globals}}的默认值,因此尽管CLJS-3087-2.patch会修复GraalJS repl的问题,但人们仍然需要在使用{{js}}或{{nodejs}}命令行工具时知道需要将其关闭。

0
评论者:kommen_

一个遇到这个问题的现实世界示例



clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} com.cognitect/transit-cljs {:mvn/version "0.8.256"}}}' -m cljs.main -re graaljs
ClojureScript 1.10.520
cljs.user=> (require '[cognitect.transit :as t])
执行错误 () 在 (<cljs repl>:1).
null

0

评论者:dnolen

迪特,我不明白你最后关于jsnodejs的评论。它们受到什么影响?

0

评论者:dnolen

我更倾向于第二个补丁,该补丁禁用了隐式全局导入。无论如何,这都是一种很难依靠的东西 ... 对于另一个票据 - 但想知道我们是否应该有对Java包的require支持。

0

评论人:kommen

(链接:~dnolen) GraalVM附带一个{{bin/js}}和{{bin/nodejs}}二进制文件,它们都使用GraalJS引擎,但默认{{js.java-package-globals}}为{{true}}。所以如果使用GraalVM的{{nodejs}}来运行ClojureScript工件,仍然会遇到有关具有问题前缀的命名空间的问题。当然,这超出了ClojureScript的控制,但我认为这为补丁提供了另一个视角,因为它没有涵盖所有可能遇到此问题的路径。

...