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}} 也能解决这个问题,因为有更多的 "tlds" 提供(包、java、javafx、javax、com、org、edu),这将修复这些包的使用。正如 Mike 指出的,这是一个破坏性的变化,因为在 graal env 中运行时,有人可能会依赖这些全局变量。

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)。

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}},以便可以在关闭 {{js.java-package-globals}} 的情况下使用 GraalJS 的 {{js}} 命令行工具,同时确保产生的主文件仍然正常工作。

0 投票

评论由:mfikes

CLJS-3087-2.patch 通过了CI测试

0 投票

评论由:mfikes

CLJS-3087-2.patch 已添加到Patch Tender

0 投票

评论由:mfikes

CLJS-3087-2.patch LGTM (是)

0 投票

评论由:kommen

在(链接: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 投票
by

评论由:kommen

(链接: ~dnolen) GraalVM 附带的 {{bin/js}} 和 {{bin/nodejs}} 二进制文件都使用 GraalJS 引擎,但它们默认将 {{js.java-package-globals}} 设置为 {{true}}。因此,如果某人使用 GraalVM 的 {{nodejs}} 运行 ClojureScript 实体,他们仍然会遇到关于具有问题前缀的命名空间的错误。当然,这是 ClojureScript 无法控制的,但我认为这为补丁提供了另一个角度,因为它并没有涵盖所有可能遇到此问题的路径。

...