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