请在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

已注意,将在可能的地方添加该要求。
+1

更新没有破坏 goog.object,它只是打破了对其的“全局”访问。这意味着任何直接在 ns 形式中使用 goog.object/get 而没有正确 (: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,则在全局命名空间而不是在 goog.module 命名空间中加载 goog.object 和 goog.array。

感谢您的回答,现在一切都很好。
...