2018年3月28日
Mike Fikes
當您編譯 ClojureScript 程式碼時,會產生一些成品,包括 JavaScript、分析元數據和原始碼映射。這些會在本機快取在輸出子目錄中(通常是「out」或「target」)。
由於這些成品產生起來很耗費資源,因此很想將它們包含在發行的函式庫 JAR 檔中。但是,這些成品會因使用的編譯器版本以及生效的建置相關編譯器選項(例如 :target
、:elide-asserts
或 :static-fns
)而有所不同,因此這種方法是不可行的。
ClojureScript 中的一項新功能可以有效地解決這個問題:啟用後,從 JAR 檔產生的編譯成品會被放置在共享快取中。這表示您可以「一次」編譯,例如,core.async
0.4.474。
共享快取可以在您電腦上的不同 ClojureScript 專案之間重複使用。如果您在專案中執行「清除」並從頭開始建置,它也可以用作填入您輸出目錄的來源。這可以大幅縮短建置時間,因為您只會編譯專案本身的原始碼。
由於 ClojureScript 本身通常是 JAR 相依性,因此共享 AOT 快取機制 — 以典型的 Lisp 元循環方式 — 適用於 ClojureScript「本身」,快取為 cljs.core
和其他隨 ClojureScript 提供的命名空間產生的成品。
這啟用了 cljs.main
的一項新功能:對於某些使用案例,例如僅使用它來執行腳本、使用 -e
評估表單,或只是啟動 REPL,cljs.main
將使用「臨時」輸出目錄,而不是透過在您執行 cljs.main
的位置建立「out」目錄來弄髒檔案系統。使用 AOT cljs.core
的能力使這個使用案例變得順暢且快速。
AOT 快取邏輯夠聰明,可以處理不同的編譯器版本、建置相關選項和 JAR 檔名稱,並使用該資訊將不同的成品變體分開儲存在快取中。而且,雖然 AOT 快取功能的動機是認為發行 JAR 檔中的程式碼是不可變的,但它也認識到在快照 JAR 檔或本機部署的 JAR 修訂版本中並非如此。在這些情況下,JAR 檔時間戳記的變更會使快取失效。
AOT 快取邏輯無法處理以下情況:發行 JAR 檔使用巨集來查詢環境,以影響為這些 JAR 檔中提供的原始碼產生的程式碼。 一個範例可能是使用巨集來使編譯後的程式碼反映設定,如果您將 在這些情況下,建議函式庫和工具改用 |
預設情況下,除非 ClojureScript 是透過 cljs.main
使用,否則此功能會停用。您可以明確使用新的 :aot-cache
編譯器選項來覆寫預設值。
由於此策略不依賴於發行 JAR 中包含 AOT 成品,因此它應該適用於 Git Deps。或許這會在 ClojureScript 未來的版本中推出。
我們鼓勵您試用此功能。我們希望此功能是您最終甚至不會想到的功能,而且它只會進一步幫助您進行日常開發!