2024 年 Clojure 状态调查! 分享您的想法。

欢迎!请在 关于 页面查看有关如何使用的更多信息。

0
ClojureScript

我有一个当使用 clojurescript 版本 1.10.879 时运行良好的移动应用程序。
当我将版本升级到 1.10.891 或 1.10.893 时,开始出现以下错误,我的应用程序停止运行

TypeError: undefined is not an object (评估 '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 的需求。

然而,还有一个与宏相关的问题更加微妙。一些库可能有发出直接访问 goog.object/get 或类似的宏。这将现在也会失效,即使使用该宏命名空间的一切做得没问题。这是因为在使用该宏的命名空间可能没有自己的 goog.object 需求(也不应该需要它)。

不幸的是,由于这些变化,需要重写宏,以便使用它们自己的辅助函数,然后才能正确地使用 goog.object,或者切换到使用 unchecked-getunchecked-set,它们基本上等同于 goog.object/getgoo.object/set。>

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

因此,如果问题是出在您自己的代码中,您只需添加 ns 需求。如果在库中,则需要在那里进行修复。或者您可以使用编译器选项 :global-goog-object&array 直至修复完好。

0
by

看起来这个问题已经在 CLJS-3330 中得到解决。修复引入了编译器选项 global-goog-object&array

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

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