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,它只是破坏了对它的“全局”访问。这意味着任何在 ns 形式中直接使用 goog.object/get 而没有适当 (:require [goog.object :as ...]) 的命名空间现在会中断。你不能再依赖于全局可用的 goog 命名空间。从技术上讲,这从未成立,但可以类推依赖,因为 cljs.core 要求 goog.object,并确保它始终加载。

所以为了正确修复这个问题,你只需要添加一个 goog.object 的 require。

然而,还有一个更微妙的问题与宏有关。某些库可能有会直接发出访问 goog.object/get 或如此的宏。即使使用该宏的命名空间做 everything properly,它现在也会中断。这是因为使用该宏的命名空间可能没有自己的 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
谢谢,状况现在都很好。
...