ClojureScript

1.10.891 版本

2021 年 11 月 4 日
ClojureScript 团队

我们很高兴宣布 ClojureScript 的新版本发布。如果您是 ClojureScript 的现有用户,请仔细阅读以下发行说明。

值得注意的变更

  • Closure Compiler 已更新至 v20210808

  • Google Closure 已更新至 0.0-20211011-0726fdeb

Google Closure 库、goog.module 和全局访问

您不应该再假设 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 库。为了理解原因,我们简要回答一些相关问题。

ClojureScript 会使用 goog.module 吗?

不会。Clojure 风格的 REPL 驱动的开发最适合原始的 Google Closure 命名空间约定。通过将命名空间表示为嵌套的 JavaScript 对象,我们有效地获得了与 Clojure 的 vars 语义上接近的延迟绑定环境,这允许高度交互式的开发工作流程。

与 ES 模块类似,goog.module 格式与 REPL 驱动的开发不兼容。在这两种情况下,模块实际上都是函数闭包,精确的重新定义根本不是设计的一部分。当比较典型的 JavaScript "热重载" 工作流程和 Clojure 开发者可用的开发体验时,交互式开发的复杂性和权衡取舍是显而易见的。

如果 Closure Compiler 不推荐使用 goog.provide 会怎样?

幸运的是,Google Closure Compiler 非常成熟。与目前流行的 JavaScript 工具不同,它不需要导出来理解要进行树摇。Closure Compiler 在对象及其属性上工作。即使 Closure Compiler 移除 goog.provide,我们也可以简单地提供我们自己的类似构造,Closure Compiler 仍然能够提供所有通常的高级优化。

变更列表

有关 ClojureScript 1.10.891 中更新的完整列表,请参阅 变更

贡献者

感谢所有为 ClojureScript 1.10.891 做出贡献的社区成员

  • Chance Russell