ClojureScript

Google Closure

使用 Google Closure 工具的動機

Clojure 非常實用,而 ClojureScript 也不例外。隨著越來越多的應用程式以網路和行動環境為目標,JavaScript 的角色和影響範圍也同樣擴展到瀏覽器之外,進入更受限的環境,例如具有節點之間無所不在網路路徑的行動裝置。Google Closure 工具提供了一組強大的函式庫、一個強大的相依性管理系統,以及一個精密的編譯器,每個工具都致力於最終減少 JavaScript 程式碼大小的目標。對於 ClojureScript,Google Closure 以三種不同的方式為 JavaScript 的「函式庫問題」提供了解決方案

  • 函式庫

  • 相依性管理

  • 積極的程式碼精簡

這些功能中的每一項都代表著數千小時的研究、設計、開發和測試。因此,ClojureScript 在其實現中利用了它們,讓 Clojure/core 團隊和貢獻者能夠專注於在任何找到 JavaScript 的地方啟用 Clojure 的強大功能。

函式庫

ClojureScript 是用 Clojure 和 ClojureScript 編寫的,與 Google Closure JavaScript 函式庫進行互通。但是,ClojureScript 可以與任何 JavaScript 函式庫或框架互通。在 ClojureScript 核心中使用 Google Closure 函式庫是一種實作策略,讓我們可以減少相依性並確保與進階模式編譯(請參閱下文)的相容性。

相依性管理

Google Closure 的相依性管理系統提供三個基本元素 addDependencyproviderequire,可啟用編譯時相依性包含。ClojureScript 將這些封裝起來,透過 ns 形式提供存取權。利用此功能可以實現 ClojureScript 命名空間和函式的細微匯入和匯出,以及用於互通性的外部 JavaScript 函式庫。

編譯器

Google 的 Closure 工具透過命令列標記,為 ClojureScript 編譯過程提供了一個 精簡編譯器。總之,精簡編譯器會接收由 ClojureScript 編譯器產生的 JavaScript,並將變數重新命名為較短的名稱,刪除空白字元、刪除註解等,以盡量減少來源大小,同時保持程式的語意。

無效程式碼分析

Google 的 Closure 編譯器提供了一個 進階設定,可以實現比上述更積極的精簡策略。事實上,Google Closure 編譯器使用高度複雜的技術來識別和消除無效程式碼(即永遠不會呼叫或無法存取的程式碼)。這個事實的缺點是,JavaScript 程式碼的樣式必須符合嚴格的標準,才能實現最大的精簡潛力。因此,ClojureScript 團隊的目標是透過遵守上述慣用語並使用 Closure 函式庫和相依性系統,確保產生的 JavaScript 程式碼盡可能地可精簡。

深入了解

Closure: The Definitive Guide

Google Closure 工具的主要參考資料是 Michael Bolin 撰寫的 O’Reilly 的 Closure:權威指南。強烈建議任何希望充分利用 ClojureScript 互通性、ClojureScript 貢獻者以及那些僅對進階 JavaScript 技術和工具感到好奇的人閱讀本書。