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

欢迎!请参阅 关于 页面以获取有关如何工作的更多信息。

0
ClojureScript

我有 一个 移动应用,在 使用 clojurescript 版本 1.10.879 时,一切正常。
当我 升级 到 1.10.891 或 1.10.893 时,我开始 接收 以 下 错误,并且 我 的 应用 程序 中 断 工作状态

TypeError: undefined 不是 对象 (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,则将 goog.object 和 goog.array 作为全局命名空间加载,而不是作为 goog.module 命名空间加载。

感谢您的帮助,现在一切都正常了。
...