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 中的完整更新清單,請參閱變更。