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环境中运行时这些全局变量的存在,那么可能会有影响。

0

评论来自:kommen

CLJS-3087-2.patch默认禁用了java包的全局变量。

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

0

评论由:mfikes

虽然这严格来说是破坏性的改变,但GraalJS还没有推出很长时间,因此这样的改变不太可能破坏任何人。如果确实这样,还是有可能覆盖默认设置的。

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

我没有检查,如果在修改默认设置时这些不会受到影响?

0

评论来自:kommen

0
(link: ~mfikes) 据我观察,这些选项不会受到默认选项更改的影响,因为使用默认选项创建的GraalJS引擎不会用于运行由{{output-main-file}}产生的工件。但我还是会建议将这些用法更改为使用 {{Java.type}}(待Nashorn兼容性),这样就可以在关闭{{js.java-package-globals}}的情况下使用GraalJS的{{js}}命令行工具,并且产生的主文件仍然可以工作。

评论由:mfikes

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

0

评论由:mfikes

CLJS-3087-2.patch 已添加到补丁提案(i)

0

评论由:mfikes

CLJS-3087-2.patch LGTM(y)

0

评论来自:kommen

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

0
_评论由 kamen_ 发表

一个真实世界遇到此问题的例子



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).
空值

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 的控制范围,但我认为它对补丁的视角又有了一些看法,因为它并没有涵盖所有可能导致此问题的情况。

...