2021 年 11 月 4 日
ClojureScript 团队
我们很高兴宣布 ClojureScript 的新版本发布。如果您是 ClojureScript 的现有用户,请仔细阅读以下发行说明。
您不应该再假设 Google Closure 库命名空间可以全局访问,因为某些依赖项可能已加载它。为了正确使用 Google Closure 库命名空间,始终需要显式 require。
一些 ClojureScript 库假设,因为 cljs.core
加载了 goog.object
,它可以安全地直接引用这些定义,例如 goog.object/get
,而无需必要的 require。这种模式在编写宏时可能有用,以便用户可以省略 require。但是,这现在是一种反模式,会导致失败。
Google 一直在慢慢地将各种命名空间转换为 goog.module
格式,该格式不会像 goog.provide
那样全局导出。为了面向未来 - ClojureScript 现在始终根据 Closure 的指南加载 goog.module
,因为 Closure 库可能随时决定将任何命名空间转换为 goog.module
,并简单地取消对该命名空间全局定义的支持。
为了简化最常见情况下的过渡,ClojureScript 有一个新的编译器标志来恢复旧的行为 - :global-goog-object&array
。
请注意,以上指南不适用于 ClojureScript 库。为了理解原因,我们简要回答一些相关问题。
goog.module
吗?不会。Clojure 风格的 REPL 驱动的开发最适合原始的 Google Closure 命名空间约定。通过将命名空间表示为嵌套的 JavaScript 对象,我们有效地获得了与 Clojure 的 vars 语义上接近的延迟绑定环境,这允许高度交互式的开发工作流程。
与 ES 模块类似,goog.module
格式与 REPL 驱动的开发不兼容。在这两种情况下,模块实际上都是函数闭包,精确的重新定义根本不是设计的一部分。当比较典型的 JavaScript "热重载" 工作流程和 Clojure 开发者可用的开发体验时,交互式开发的复杂性和权衡取舍是显而易见的。
有关 ClojureScript 1.10.891 中更新的完整列表,请参阅 变更。