2024 Cloujure状态调查中分享你的想法!

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

0
ClojureScript

我们需要在第1个段上递归,向resolve-var传递一个新参数,表示不应尝试在当前命名空间中解析,而是发出警告。

5 个答案

0
_评论由:thheller_发表

我在试图弄清楚为什么{{process.env.FOO}}(没有{{js/}})不会产生警告时偶然发现,几乎所有带点的符号都会错误地解析,并且似乎可以正常工作。它们也不会产生任何警告。

在试图修复这个问题时,我遇到了很多代码都是在依赖这种行为。最显著的是{{defrecord}}和{{exists?}}。

{{defrecord}}很容易修复,因为它使用{{cljs.core.MapEntry}} [1]而不是{{cljs.core/MapEntry}}。{{cljs.core.MapEntry}}解析为{{cljs/core.MapEntry}},几乎所有的带点符号都会解析为第一个部分,将其转换为命名空间。这有效,因为{{munge}}会在 later on 将{{/}}转换为{{.}}。

{{exists?}}会将{{some.nested.Thing}}分解为检查{{some}},{{some.nested}},{{some.nested.Thing}},这又变成了{{some}},{{some/nested}},{{some/nested.Thing}}。我试图直接在{{cljs.analyzer/analyze-symbol}}中修复此问题,通过将{{some.nested.Thing}}适当地缩减为{{(. (. some -nested) -Thing)}},但这是不够的,因为宏可以直接使用带点的符号调用{{cljs.analyzer/resolve-var}}(例如,{{exists?}})。

现在我对如何修复这种问题不确定。我认为这确实值得关注修复,但它可能会在使用者代码中产生许多警告。这可以接受吗?

[1] https://github.com/clojure/clojurescript/blob/6062744a1600479d5b9c641db9fb15cbb
0

评论由:thheller 发表

FWIW,我在shadow-cljs中添加了一个相当蹩脚的解决方案(链接:1),并且它已经发现了几个流行CLJS库中的实际错误,以及在{{cljs.core}}本身中的一些问题。这绝对不能算是全面总结,但这些在继续之前应该被修复,否则会产生大量的警告。尽管如此,我仍然不确定如何干净利落地进行修复。

https://dev.clojure.org/jira/browse/CLJS-2982
https://dev.clojure.org/jira/browse/CLJS-2983
https://dev.clojure.org/jira/browse/CLJS-2984

https://github.com/Day8/re-frame-10x/issues/219
https://github.com/nathanmarz/specter/issues/267

(链接:1) https://github.com/thheller/shadow-cljs/blob/22944d9bba14a8428efbd52463a37eb636017609/src/main/shadow/build/ cljs_hacks.cljc#L239-L308

0
by

评论由:thheller 发表

在rrb-vector库中也发现了一个问题。(链接:1)

符号
`clojure.core.rrb_vector.rrbt.Vector`
从技术上讲会生成正确的JS结果,但永远不会与任何分析器数据相关联。虽然在这里可能不需要,但它仍然感觉像应该产生一个警告的东西。

(链接:1) https://github.com/clojure/core.rrb-vector/blob/88c605a72f1176813ca71d664275d480285f634e/src/main/ cljs/clojure/core/rrb_vector/macros.clj#L23-L24

0
by

评论者:mfikes

FWIW,托马斯指出的这个问题确实会导致自宿ClojureScript崩溃,所以如果我们改善了这方面的警告,那将是好事。参见CRRBV-16

0
by
...