:asset-path "js/compiled/out"
以下是可传递给 ClojureScript 编译器的编译器选项列表。
使用 :main
时,通常需要控制入口点脚本尝试从何处加载脚本,因为 web 服务器的配置不同。:asset-path
是一个相对 URL 路径,而不是文件系统路径。例如,如果您的输出目录是 :output-dir "resources/public/js/compiled/out"
,但您的 web 服务器从 "resources/public"
提供服务,那么您希望入口点脚本从 "js/compiled/out" 加载脚本。
:asset-path "js/compiled/out"
使用 :target :bundle
时,设置在构建后运行的 shell 命令。此命令不可参数化。您应提供 :none
(将在开发构建后运行)和 :default
(将在通过 Closure Compiler 传递的构建后运行)。该命令应该是退出命令,即您不能使用它来启动观察器。
:bundle-cmd {:none ["npx" "webpack" "--mode=development"]
:default ["npx" "webpack"]}
如果设置为 :warn
或 :error
,则检查推断的类型和传递给 aget
和 aset
的运行时值。推断的类型不匹配将导致触发 :invalid-array-access
警告。如果设置为 :warn
,则在传递不正确的值时记录日志,如果设置为 :error
,则抛出异常。可以设置为 false
值以禁用此功能。
如果 :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 和 options 映射。如果尚未加载该符号所指的命名空间,则编译器将要求该命名空间。如果该值为关键字,则它用作 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
。
注意:这将导致主命名空间以及所有 |
一个用于发出 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
。
可以使用 ClojureScript 与 Webpack 找到可靠的替代方法。 |
: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
中的值隐式引用。
对于 |
参见 源映射。在 :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 编译器如何对作为赋值和变量声明中的 r 值出现的匿名函数进行命名的策略。默认值为 :off
。
:anon-fn-naming-policy :unmapped
支持以下值
:off
不要给匿名函数命名。
:unmapped
生成基于赋值左侧的名称。在变量和属性重命名之后运行,因此生成的名称将很短且会被混淆。
:mapped
生成简短的唯一名称,并提供从这些名称到基于赋值左侧的更有意义的名称的映射。
如果 ClojureScript 通过 cljs.main
使用,则默认为 true
,否则为 false
,或者如果 ClojureScript 用作 git 依赖项。控制是否使用共享 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
中设置的变量中使用 if
或 cond
与 identical?
比较相结合来消除代码中的部分代码(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 编译器警告维基,了解详细说明。
此标志将导致所有 (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 库的依赖项,即与 Google Closure 兼容的 javascript 文件,具有正确的 goog.provides()
和 goog.requires()
调用。请注意,这些目录中的文件将被监视,如果它们被修改,则会发生重建。
可以给出路径或文件名。相对路径相对于当前工作目录(通常是项目根目录)。
默认为空向量 []
: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 输出以避免覆盖全局变量。有四种可能的 value 类型
函数 - 接受一个参数,即编译后的 javascript 输出。应返回其他有效的 javascript 输出。对于最简单的情况,只需将 javascript 输出与类似于 #3(默认包装器)的内容字符串连接起来。
字符串 - 一些 format
插值兼容的字符串。例如,"(function(){%s};)()"
。format
以编译后的 javascript 输出作为第二个参数,其他参数则没有。
真值 - 使用默认的 (function(){…};)()
包装。
假值 - 不要包装。这是默认值。
;; 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"
)。
默认为
:nodejs
(["main"]
) 如果 :target
为 :nodejs
:webpack
(["browser", "module", "main"]
) 否则
也可以接受自定义条目向量,例如 ["browser", "main"]
。
确定是否在 JavaScript 中输出注释,这些注释可用于确定编译代码的原始来源。
默认为 false。
:print-input-delimiter false
默认为
false
如果 :target
为 :nodejs
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
指定一个前缀,该前缀将被附加到所有变量。当使用代码拆分时,可以使用它来防止与 JavaScript 全局范围内的其他代码发生冲突。
:rename-prefix "prefix"
如果设置为 true,则 Google Closure Compiler 将添加 polyfills(例如,当您使用原生 JavaScript Promise
时)。**这需要将:language-in
设置为:es6
或更高版本,否则将被静默忽略!**
:language-in :es6
:rewrite-polyfills true
设置源映射中引用的源文件的路径,以避免进一步的 Web 服务器配置。
:source-map-path "public/js"
此选项影响发出的源映射 V3 JSON 文件的sources
条目。
:source-map-asset-path "http://foo.com/public/js/out"
将静态调度应用于发出的 JavaScript 中的特定函数元数,而不是使用call
构造。默认情况下为 false,除非在高级优化下。对于 REPL 开发设置为 false 有用,以方便函数重新定义,而对于发布设置为 true 有用以提高性能。
此设置不适用于标准库,该库始终隐式将:static-fns
设置为 true 进行编译。
: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]