请在 Clojure 2024 年度调查! 分享您的想法。

欢迎!有关此架构的更多信息,请参阅 关于 页面。

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)



请参阅 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) 中使用的文本: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}},以便能够在关闭 {{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

在graalvm/graaljs仓库的问题页(链接: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])
执行错误 () at (<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 的控制范围,但我认为这也从另一个角度解释了这个补丁,因为它没有涵盖所有可能导致此问题的路径。

...