:asset-path "js/compiled/out"
以下是可以傳遞給 ClojureScript 編譯器的編譯器選項列表。
當使用 :main
時,通常需要控制進入點腳本嘗試從哪裡載入腳本,這取決於網頁伺服器的組態。:asset-path
是相對 URL 路徑,而不是檔案系統路徑。例如,如果您的輸出目錄是 :output-dir "resources/public/js/compiled/out"
,但您的網頁伺服器是從 "resources/public"
提供檔案,那麼您會希望進入點腳本從 "js/compiled/out" 載入腳本。
:asset-path "js/compiled/out"
當使用 :target :bundle
時,設定在建置後執行的 shell 命令。此命令不可參數化。您應提供在開發建置後執行的 :none
,以及在通過 Closure Compiler 後執行的 :default
。命令應為會結束的命令,也就是說,您不能用它來啟動監看器。
:bundle-cmd {:none ["npx" "webpack" "--mode=development"]
:default ["npx" "webpack"]}
如果設定為 :warn
或 :error
,則會檢查傳遞給 aget
和 aset
的推斷類型和執行階段值。推斷類型不符將會觸發 :invalid-array-access
警告。如果設定為 :warn
,則會在傳遞不正確的值時記錄;如果設定為 :error
,則會拋出例外。可以設定為假值以停用此功能。
如果 :optimizations
設定為 :advanced
,則此設定不適用。
:checked-arrays :warn
設定外部函式庫的 externs 檔案。會在目前的工作目錄和類別路徑中搜尋這些檔案。
對於此選項以及以下選項,您可以在以下網址找到非常好的說明:http://lukevanderhart.com/2011/09/30/using-javascript-and-clojurescript.html
預設為空向量 []
。
:externs ["jquery-externs.js"]
新增對外部函式庫的相依性。請務必讓 URL 傳回 HTTP 代碼 200。
預設為空向量 []
:foreign-libs [{ :file "http://example.com/remote.js"
:provides ["my.example"]
:global-exports '{my.example MyExample}}
{ :file "./resources/js/local.js"
:provides ["my.other.example"]}
{ :file "./path/to/directory/"
;; :provides will be automatically generated based on
;; each .js filename. E.g: your.dep.js file will
;; provides ["your.dep"]. Custom defined :provides in
;; this case will be overwritten.
}]
:foreign-libs
向量中的每個元素都應該是一個對應,其中的索引鍵具有以下語意
:file
表示函式庫的 URL。這可以是本機路徑,也可以是相依性檔案的遠端 URL。如果本機路徑是目錄而非檔案,編譯器將會遞迴搜尋目錄中的所有 .js
檔案,並根據 .js
檔案名稱自動指派 :provides
值。例如:your.js.deps.js
會產生計算的 :provides
["your.js.deps"]
,而您的自訂 :provides
將會被產生的 :provides
覆寫。
:file-min
(選用) 表示函式庫的最小化變體的 URL。如果 :optimizations
設定為 :simple
或 :advanced
,則會優先使用此值,而非 :file
。
:provides
與函式庫相關聯的合成命名空間。這通常是一個包含單一字串的向量,但它能夠指定多個命名空間 (通常僅由 Google Closure 函式庫使用)。
:requires
(選用) 明確識別相依性 (來自其他外部函式庫的 :provides
值) 的向量;用於形成依賴關係的拓樸排序。
:module-type
(選用) 表示外部函式庫使用給定的模組系統。可以是 :commonjs
、:amd
、:es6
其中之一。請注意,如果提供,則不會使用 :requires
(因為它是隱含決定的)。如需更多資訊,請參閱JavaScript 模組支援 (Alpha)。
:preprocess
(選用) 用於預處理/轉換其他方言 (JSX 等) 中的程式碼。值可以是符號或關鍵字。如果提供符號,則它應解析為接受兩個參數的函式:js-module 和選項對應。如果符號參照的命名空間尚未載入,編譯器將會需要該命名空間。如果值是關鍵字,則它會作為 cljs.clojure/js-transforms
多重方法的分派值使用。如需更多資訊,請參閱JavaScript 函式庫預處理。
:global-exports
(選用) 用於將提供的命名空間對應到全域匯出的值。索引鍵可以是符號或字串。如果存在,則當需要時,可以使用慣用的外部函式庫,即支援 :refer
、:rename
、:as
等。
預設為 false
。如果為 true
,則會將 goog.object
和 goog.array
載入為全域命名空間,而不是作為 goog.module
命名空間。
指定進入點命名空間。當與最佳化層級 :none
組合使用時,:main
會導致編譯器發出單一 JavaScript 檔案,該檔案會匯入 goog/base.js、命名空間的 JavaScript 檔案,並發出必要的 goog.require
陳述式。這允許在開發和生產之間保留相同的 HTML 標記。
通常以符號的形式提供。在 EDN 組態檔中,您不需要引用符號。
:main foo.bar
:main
也可以字串的形式提供,但前者是較佳的做法。
:main "foo.bar"
另請參閱 :asset-path
。
注意:這會導致將 main 命名空間,以及所有 |
用於發出 Google Closure 模組的新選項。Closure 模組支援將最佳化建置分割成 N 個不同的模組。如果提供 :modules
,則會取代單一的 :output-to
。模組需要名稱、個別的 :output-to
檔案路徑、:entries
(一組命名空間) 和 :depends-on
(模組相依的一組模組)。範例如下
{:optimizations :advanced
:source-map true
:output-dir "resources/public/js"
:modules {
:common
{:output-to "resources/public/js/common.js"
:entries #{"com.foo.common"}}
:landing
{:output-to "resources/public/js/landing.js"
:entries #{"com.foo.landing"}
:depends-on #{:common}}
:editor
{:output-to "resources/public/js/editor.js"
:entries #{"com.foo.editor"}
:depends-on #{:common}}}}
不在 :entries
集合中的任何命名空間都將移至預設模組 :cljs-base
。然而,由於跨模組程式碼移動,Google Closure 可以將函式和方法移動到實際使用的模組中。此過程有些保守,因此如果您知道想要將某些程式碼保留在一起,請透過 :entries
來執行。
:cljs-base
模組預設會寫入到 :output-dir
,名稱為 "cljs_base.js"。可以透過指定描述 *僅* :output-to
的 :cljs-base
模組來覆寫此預設值。
請仔細注意,命名空間在所有模組 :entries
中只能出現一次。
:modules
完全支援 :foreign-libs
。:foreign-libs
一律會在任何 Google Closure 編譯的來源程式碼之前依賴順序放置。
完全支援來源對應,每個模組都會建立一個單獨的來源對應。只需提供 :source-map true
(請參閱範例),因為沒有單一來源對應可命名。
控制 NPM 相依性。NPM 套件名稱 (關鍵字或字串) 與所需版本,或布林值的對應。如果設定為真值,則會建立索引並使用 node_modules
目錄。預設為 false
。(在 ClojureScript 1.10.339 和更早版本中,預設為 true
。)另請參閱 :install-deps
。
您可以在搭配 Webpack 的 ClojureScript 中找到可靠的替代方案。 |
:npm-deps {"lodash" "4.17.4"}
最佳化層級。可以是 :none
、:whitespace
、:simple
或 :advanced
。僅支援針對啟動的 ClojureScript 使用 :none
和 :simple
。
:none
是建議的開發設定,而 :advanced
是建議的生產設定,除非有某些因素阻止 (不相容的外部函式庫、錯誤等)。
如需有關不同最佳化模式的詳細說明,請參閱Closure Compiler 編譯層級。
node.js externs 也可作為有用的範例。
當未使用:main
選項時,:none
需要手動載入程式碼,因此需要與其他選項不同的 HTML。
預設為 :none
。
:optimizations :none
開發 ClojureScript 通常需要僅在開發時間產生的副作用,例如啟用列印、記錄和連線 REPL。:preloads
允許在 cljs.core
之後立即載入這類副作用的樣板。例如,您可以建立用於在瀏覽器中啟用列印的開發命名空間
(ns foo.dev)
(enable-console-print!)
現在,您可以使用下列編譯器選項來設定開發建置,以在主要命名空間之前載入此副作用
{:preloads '[foo.dev]
:main 'foo.core
:output-dir "out"}
:preloads
必須是符號序列,對應到類別路徑上可探索的現有命名空間。請注意,當使用 Leiningen 時,不需要前導引號 - project.clj
中的值會隱含地引用。
對於 |
請參閱 Source-maps。在 :none
優化設定下,有效值為 true
和 false
,預設值為 true
。在所有其他優化設定下,必須指定要寫入來源對應的路徑。
在 :none
設定下
:source-map false
否則
:source-map "path/to/source/map.js.map"
有效選項為 :nodejs
、:webworker
、:bundle
和 :none
。
預設值(未指定 :target
)表示目標為瀏覽器。
請參考這裡,以取得如何在 nodejs 中執行程式碼的更多資訊。
:webworker
會產生適合使用 Web Workers 載入的引導腳本。
:bundle
目標是為了支援 node_modules
中的依賴項。ClojureScript 產生的輸出需要傳遞給其他 JavaScript 工具(例如 Webpack、Metro),才能處理為這些依賴項產生的 Node.js 樣式 require
導入。
:none
目標會產生不依賴任何特定執行環境的輸出。
:target :nodejs
Google Closure 編譯器如何命名在賦值和變數宣告中作為右值出現的匿名函數的策略。預設為 :off
。
:anon-fn-naming-policy :unmapped
支援以下值
:off
不給匿名函數命名。
:unmapped
產生基於賦值左側的名稱。在變數和屬性重新命名後執行,以便產生的名稱簡短且混淆處理。
:mapped
產生簡短的唯一名稱,並提供從這些名稱到基於賦值左側的更有意義名稱的對應。
如果透過 cljs.main
使用 ClojureScript,則預設為 true
,否則或如果 ClojureScript 被用作 git 依賴項,則預設為 false
。控制是否將共享 AOT 快取用於從 JAR 產生的編譯器成品。
:aot-cache true
實驗性功能。將編譯器分析快取到磁碟。這可以加快冷建置和 REPL 啟動時間。
對於 REPL,預設為 true
。否則,當且僅當 :optimizations
為 :none
時,預設為 true
。
:cache-analysis true
設定使用 @define 或 cljs.core/goog-define
輔助巨集註釋的 Closure 函式庫變數的值。常見的用法是將 goog.DEBUG
設定為 false
:closure-defines {"goog.DEBUG" false}
您也可以使用符號
:closure-defines {my.cool-ns/some-def true}
請注意,當使用 Lein 時,由於隱含的引用,因此不需要引號。
對於 |
您可以使用在 :closure-defines
中設定的變數,在編譯時消除程式碼的部分 (DCE)。但是,要做到這一點,您必須將 if
或 cond
與 identical?
比較結合使用。任何其他形式(例如 case
或 condp
)在執行時都可以正常工作,但是 javascript 輸出將包含無效的程式碼分支。
例如,如果您想要建立僅包含與語言環境相關的翻譯訊息的應用程式本地化版本
(def messages
(cond
(identical? js/goog.LOCALE "nl") i18n.nl/messages
(identical? js/goog.LOCALE "fr") i18n.fr/messages
:else i18n.en/messages))
定義 Closure 函式庫可能使用的額外 JSDoc 註釋,以便它們不會觸發編譯器警告。
:closure-extra-annotations #{"api"}
設定輸出字元集。可以是
iso-8859-1
us-ascii
utf-16
utf-16be
utf-16le
utf-8
預設為 utf-8
:closure-output-charset "iso-8859-1"
設定 Closure 編譯器產生的警告。從 Closure 警告到設定值的對應,僅支援 :error
、:warning
和 :off
。
:closure-warnings {:externs-validation :off}
以下 Closure 警告選項公開給 ClojureScript
:access-controls
:analyzer-checks
:check-regexp
:check-types
:check-useless-code
:check-variables
:closure-dep-method-usage-checks
:conformance-violations
:const
:constant-property
:debugger-statement-present
:deprecated
:deprecated-annotations
:duplicate-message
:duplicate-vars
:es5-strict
:externs-validation
:extra-require
:function-params
:global-this
:invalid-casts
:j2cl-checks
:jsdoc-missing-type
:late-provide
:lint-checks
:message-descriptions
:misplaced-msg-annotation
:misplaced-type-annotation
:missing-getcssname
:missing-override
:missing-polyfill
:missing-properties
:missing-provide
:missing-require
:missing-return
:missing-sources-warnings
:module-load
:msg-conventions
:non-standard-jsdoc
:report-unknown-types
:strict-missing-properties
:strict-missing-require
:strict-module-dep-check
:strict-requires
:suspicious-code
:too-many-type-params
:tweaks
:type-invalidation
:undefined-variables
:underscore
:unknown-defines
:unnecessary-escape
:unused-local-variable
:unused-private-property
:use-of-goog-base
:violated-module-dep
:visiblity
請參閱 Closure Compiler 警告 wiki 以取得詳細說明。
此旗標會導致在編譯期間移除所有 (assert
*x* )
呼叫,包括與 :pre
和 :post
條件相關的隱式 assert
。對生產環境很有用。即使在進階編譯中,預設值也始終為 false。不指定 goog.asserts.ENABLE_ASSERTS
,這與 Closure 函式庫所使用的不同。
請注意,對於 JVM ClojureScript,無法在執行時動態將 |
預設為 false
。是否啟用指紋辨識,這會將內容 SHA 附加到輸出檔案名稱。會為對應指紋辨識檔案名稱在 :output-dir
中產生 manifest.edn
。當使用 :modules
和 :source-map
選項時,這特別有用,因為指紋辨識檔案名稱將會被適當地引用。
:fingerprint true
需要 :static-fns true
。此選項會發出稍微不同的程式碼,可以將程式碼速度提高約 10-30%。不實作 IFn
協定的高階函式通常會使用 f.call(null, arg0, arg1 …)
呼叫。啟用此選項後,編譯器會使用更快的 f(arg0, arg1 …)
呼叫它們。
|
:fn-invoke-direct true
:elide-asserts true
當使用 :target :nodejs
時,編譯器會發出 shebang 作為編譯來源的第一行,使其可執行。當您的意圖是建置一個 node.js 模組而不是可執行檔時,請使用此選項移除 shebang。
:hashbang false
啟用自動為 JavaScript 的互通呼叫產生 externs。預設為 false
。如需更多資訊,請參閱 Externs (Alpha)
:infer-externs true
設定 Closure 函式庫的輸入和輸出語言。可以是
:ecmascript-next
與 :es-next
相同
:ecmascript-2021
與 :es-2021
相同
:ecmascript-2020
與 :es-2020
相同
:ecmascript-2019
與 :es-2019
相同
:ecmascript-2018
與 :es-2018
相同
:ecmascript-2017
與 :es-2017
相同
:ecmascript-2016
與 :es-2016
相同
:ecmascript-2015
與 :es-2015
相同
:ecmascript6
與 :es6
相同
:ecmascript6-strict
與 :es6-strict
相同
:ecmascript5
與 :es5
相同
:ecmascript5-strict
與 :es5-strict
相同
:ecmascript3
與 :es3
相同
:no-transpile
:language-in
預設為 :ecmascript5
,:language-out
預設為 :no-transpile
:language-in :ecmascript5
:language-out :no-transpile
新增對外部 js 函式庫的依賴項,也就是具有正確的 goog.provides()
和 goog.requires()
呼叫的 Google Closure 相容 javascript 檔案。請注意,將監看這些目錄中的檔案,如果修改這些檔案,將會重新建置。
可以給定路徑或檔案名稱。相對路徑是相對於目前工作目錄(通常是專案根目錄)。
預設為空向量 []
:libs ["closure/library/third_party/closure"
"src/js"
"src/org/example/example.js"]
停用 Node.js 執行時間支援的旗標。當目標不是 Node.js,而是目標了解 Node.js 樣式 require
慣例的 JavaScript 工具時很有用
:nodejs-rt false
當設定為 true
時,常數(例如關鍵字和符號)只會建立一次,並將寫入單獨的檔案 (cljs/core/constants.js
)。編譯器將發出對常數表中定義的常數的參考,而不是為其建立新物件。此選項主要用於發行建置,因為它可以由於減少配置而提高效能。在 :advanced
優化設定下預設為 true
,否則為 false
。
:optimize-constants true
包裝 Javascript 輸出以避免覆蓋全域變數。有四種可能的值類型
函式 - 接受一個引數,即編譯後的 javascript 輸出。應傳回其他一些有效的 javascript 輸出。對於最簡單的情況,只需將 javascript 輸出與類似於 #3 (預設包裝) 的內容進行字串串聯
字串 - 某些與 format
內插相容的字串。例如,"(function(){%s};)()"
。format
接收編譯後的 javascript 輸出作為第二個引數,沒有其他引數。
Truthy - 使用預設 (function(){…};)()
包裝
Falsey - 不包裝。這是預設值。
;; function
(fn [js-output]
(str "(function(){" js-output "};).call(window);"))
;; string
"(function(){%s};).call(window);"
;; truthy
true
;; falsey
false
設定在解析 NPM 套件上的 (和之間的) 相依性時,依哪種順序使用哪個 package.json
條目 (例如 "browser"
、"module"
或 "main"
)。
預設為
如果 :target
為 :nodejs
,則為 :nodejs
(["main"]
)
否則為 :webpack
(["browser", "module", "main"]
)
也可以採用自訂條目向量,例如 ["browser", "main"]
。
決定是否在 JavaScript 輸出註解,這些註解可用於判斷編譯程式碼的原始來源。
預設值為 false。
:print-input-delimiter false
預設為
如果 :target
是 :nodejs
,則為 false
否則為 true
自動為 Node.js process.env
提供 shim,其中包含單一 Google Closure 定義,NODE_ENV
,預設值為 "development"
。在生產環境中,NODE_ENV
將設定為 "production"
。如果設定為 false
,則會停用所有上述行為。
在 :advanced
模式優化下,決定是否發出可讀的名稱。這在除錯優化後的 JavaScript 時很有用,並且有助於尋找遺失的 externs。預設值為 false。
:pseudo-names true
為了確保正確性,ClojureScript 編譯器現在會在父命名空間變更時,總是重新編譯依賴的命名空間。這可以防止建置損毀和被吞噬的警告。然而,這可能會影響編譯時間,具體取決於應用程式的結構。此選項預設為 true
。
:recompile-dependents false
如果設定為 true,google closure compiler 將會加入 polyfill(例如當您使用原生 javascript Promise
時)。這需要將 :language-in
設定為 :es6
或更高版本,否則會被靜默忽略!
:language-in :es6
:rewrite-polyfills true
設定原始碼對應中參考的原始程式碼檔案的路徑,以避免進一步的網路伺服器配置。
:source-map-path "public/js"
此選項會影響發出的原始碼對應 V3 JSON 檔案的 sources
條目。
:source-map-asset-path "http://foo.com/public/js/out"
在發出的 JavaScript 中,對特定函式參數數量採用靜態分派,而不是使用 call
建構。預設值為 false,但在進階優化下除外。在 REPL 開發時設定為 false 以方便函式重新定義很有用,並且為了效能在發佈時設定為 true 很有用。
此設定不適用於標準程式庫,該程式庫總是使用隱式設定為 true 的 :static-fns
編譯。
:static-fns true
若要為呼叫宣告的函式啟用靜態分派,請提供 |
設定一個任意的 Clojure 函式,以產生開發主要進入點 JavaScript 檔案。必須是一個符號,代表類別路徑上命名空間中存在的 Clojure 函式。僅在 :optimization :none
下使用。
:target-fn 'some.custom.dev-bootstrap
此旗標將啟用/停用編譯器針對未宣告的變數、錯誤的函式呼叫參數數量等的警告。可以是布林值,用於啟用/停用常見警告,或包含特定警告鍵及其相關布林值的地圖。預設值為 true。
:warnings true
;; OR
:warnings {:fn-deprecated false} ;; suppress this warning
支援以下警告
:declared-arglists-mismatch
,宣告的 :arglists
與定義不符
:dynamic
,非動態變數的動態繫結
:extend-type-invalid-method-shape
,方法參數數量必須分組在一起
:extending-base-js-type
,JavaScript 基礎型別擴充
:fn-arity
,無效的調用參數數量
:fn-deprecated
,已棄用的函式使用
:fn-var
,先前繫結至函式的變數變更為不同型別
:infer-warning
,與 externs 推斷相關的警告
:invalid-arithmetic
,無效的算術
:invalid-array-access
,無效使用 aget
或 aset
:invalid-protocol-symbol
,無效的協定符號
:invoke-ctor
,將型別建構子當作函式調用
:js-shadowed-by-local
,名稱被區域變數遮蔽
:multiple-variadic-overloads
,多個可變參數數量
:munged-namespace
,命名空間名稱包含保留的 JavaScript 關鍵字
:ns-var-clash
,命名空間與變數衝突
:overload-arity
,重複的參數數量
:preamble-missing
,遺失前導碼
:private-var-access
,從另一個命名空間存取私有變數
:protocol-deprecated
,已棄用的協定使用
:protocol-duped-method
,重複的協定方法實作
:protocol-impl-recur-with-target
,在遞迴至協定方法標頭時傳遞了目標
:protocol-impl-with-variadic-method
,協定實作採用可變參數簽名
:protocol-invalid-method
,協定方法與宣告不符
:protocol-multiple-impls
,協定實作多次
:protocol-with-overwriting-method
,協定方法覆寫其他協定方法
:protocol-with-variadic-method
,協定宣告可變參數簽名
:redef
,變數重新定義
:single-segment-namespace
,單一段命名空間
:variadic-max-arity
,參數數量大於可變參數數量
:undeclared-ns
,變數參考不存在的命名空間
:undeclared-ns-form
,在 ns 表單中參考不存在的命名空間
:undeclared-protocol-symbol
,參考了未宣告的協定
:undeclared-var
,未宣告的變數
:unprovided
,未提供要求的命名空間
:unsupported-js-module-type
,不支援的 JavaScript 模組型別
:unsupported-preprocess-value
,不支援的外部程式庫前處理值
設定一組處理常式,以自訂發出的警告的處理方式。處理常式應該是符號 (將解析為函式) 或函式。每個函式的簽名為 [warn-type env warn-info]
。warn-type
是一個關鍵字,描述 警告、env
是分析環境,而 warn-info
是特定警告型別的額外有用資訊的地圖。
預設為
:warning-handlers [cljs.analyzer/default-warning-handler]