请分享您的想法,参与 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

更新并未破坏goog.object,它只破坏了对它的“全局”访问。这意味着任何使用goog.object/get而没有在ns形式中正确使用(:require [goog.object :as ...])的命名空间将现在会破碎。您不能再依赖全局可用的goog命名空间。从技术上讲,这从来都不正确,但可以依赖cljs.core需要goog.object并确保它总是被加载。

因此,要正确修复此问题,只需添加一个goog.object依赖项。

然而,还有一个与宏相关的问题更为微妙。某些库可能有宏,这些宏直接生成访问goog.object/get的形式。现在,即使使用该宏的命名空间做得完全正确,这也会破坏。这是因为使用宏的命名空间可能没有自己的goog.object依赖(也不需要有这样的依赖)。

不幸的是,由于这些变化,需要重写宏,要么使用它们自己的帮助函数,然后可以使用goog.object进行适当的操作,要么切换到使用unchecked-getunchecked-set,这两个命令基本上等同于goog.object/getgoo.object/set

根据公告,添加了一个编译器选项以使过渡更加顺畅。

因此,如果是您自己的代码中的问题,您只需添加ns依赖项。如果是库中的问题,需要在那里修复。或者,您可以使用编译器选项:global-goog-object&array直到问题得到修复。

0

这似乎已在CLJS-3330中得到处理。引入的修复程序添加了编译器选项global-goog-object&array

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

谢谢,现在一切正常了。
...