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

欢迎!请查看关于页面以了解更多关于这如何工作的信息。

0
ClojureScript

我的移动应用程序在使用 clojurescript 版本 1.10.879 时运行良好。
一旦升级到 1.10.891 或 1.10.893,我就会开始遇到以下错误,我的应用程序也停止工作

TypeError: undefined is not an object (evaluating 'some-ns.goog$module$goog$object.get')

3 答案

+2

您应该在命名空间声明中显式添加 (:require [goog.object])。如果使用无法更改的库,请使用 global-goog-object&array

请参阅文档
https://script.clojure.org/news/news#_google_closure_library_goog_module_global_access

已记录,将在可能的情况下添加 require。
+1
by

更新并没有破坏 goog.object,它只是破坏了对它的“全局”访问。这意味着任何直接在不正确的 (:require [goog.object :as ...]) 中使用 goog.object/get 的命名空间都将现在会中断。您不能再依赖于 goog 命名空间全局可用。在技术上这从未有效,但可以依赖它是加载的。

要正确修复此问题,只需添加一个 goog.object require。

然而,还有一个更多微妙的问题,它与宏有关。某些库可能有宏,会直接产生形式来访问 goog.object/get 或类似的。现在即使使用该宏的命名空间一切都做得正确,这也会导致破坏。这是因为使用该宏的命名空间很可能没有自己的 goog.object require(并且不应该需要它)。

不幸的是,由于这些变化,必须将宏重新编写,以便使用它们自己的辅助函数来正确使用 goog.object,或者切换到使用 unchecked-getunchecked-set,它们基本上等价于 goog.object/getgoo.object/set

根据公告,增加了一个编译器选项,以使过渡更加平滑。

所以如果问题是出在您的代码中,您只需添加 ns require。如果是库中,需要在这里修复。或者您可以使用编译器选项 :global-goog-object&array 直到问题解决。

0
by

似乎这已经在 CLJS-3330 中得到了解决。引入的修复增加了编译器选项 global-goog-object&array

默认为 false。如果为 true,则将 goog.object 和 goog.array 作为全局命名空间加载,而不是作为 goog.module 命名空间。

by
谢谢您的帮助,现在一切都很好。
...