ClojureScript

编译器选项

常用选项

:asset-path

使用 :main 时,通常需要控制入口点脚本尝试从何处加载脚本,因为 web 服务器的配置不同。:asset-path 是一个相对 URL 路径,而不是文件系统路径。例如,如果您的输出目录是 :output-dir "resources/public/js/compiled/out",但您的 web 服务器从 "resources/public" 提供服务,那么您希望入口点脚本从 "js/compiled/out" 加载脚本。

:asset-path "js/compiled/out"

:bundle-cmd

使用 :target :bundle 时,设置在构建后运行的 shell 命令。此命令不可参数化。您应提供 :none(将在开发构建后运行)和 :default(将在通过 Closure Compiler 传递的构建后运行)。该命令应该是退出命令,即您不能使用它来启动观察器。

:bundle-cmd {:none ["npx" "webpack" "--mode=development"]
             :default ["npx" "webpack"]}

:checked-arrays

如果设置为 :warn:error,则检查推断的类型和传递给 agetaset 的运行时值。推断的类型不匹配将导致触发 :invalid-array-access 警告。如果设置为 :warn,则在传递不正确的值时记录日志,如果设置为 :error,则抛出异常。可以设置为 false 值以禁用此功能。

如果 :optimizations 设置为 :advanced,则此设置不适用。

:checked-arrays :warn

:externs

配置外部库的 externs 文件。在当前工作目录和类路径中搜索这些文件。

对于此选项以及以下选项,您可以在以下位置找到非常好的解释:http://lukevanderhart.com/2011/09/30/using-javascript-and-clojurescript.html

默认为空向量 []

:externs ["jquery-externs.js"]

:foreign-libs

添加对外部库的依赖项。请确保 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 等。

:global-goog-object&array

默认为 false。如果为 true,则将 goog.objectgoog.array 作为全局命名空间加载,而不是作为 goog.module 命名空间加载。

:install-deps

如果为 true,则自动安装所有声明的 :npm-deps,包括上游依赖项中声明的那些依赖项。

:main

指定入口点命名空间。与优化级别 :none 结合使用时,:main 将导致编译器发出一个 JavaScript 文件,该文件将导入 goog/base.js、命名空间的 JavaScript 文件,并发出所需的 goog.require 语句。这允许在开发和生产之间保留相同的 HTML 标记。

通常作为符号提供。在 EDN 配置文件中,您不需要引用符号。

:main foo.bar

:main 也可以作为字符串提供,但前者更可取。

:main "foo.bar"

另请参见 :asset-path

注意:这将导致主命名空间以及所有 :required 命名空间的传递闭包加载到您的 JavaScript 环境中。如果您有其他需要加载的未引用命名空间,请考虑使用 :require 加载它们,或通过发出相应的额外 goog.require 语句手动加载它们。

:modules

一个用于发出 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-deps

控制 NPM 依赖项。一个 NPM 包名(关键字或字符串)到所需版本的映射,或者一个布尔值。如果设置为真值,则会对 node_modules 目录进行索引并使用它。默认为 false。(在 ClojureScript 1.10.339 和更早版本中,默认为 true。)另请参见 :install-deps

:npm-deps 功能处于针对优化构建的 alpha 状态。在应用 Closure 优化时,NPM 依赖项会通过 Closure Compiler 传递,并非所有 NPM 库都包含 Closure 兼容的代码。

可以使用 ClojureScript 与 Webpack 找到可靠的替代方法。

:npm-deps {"lodash" "4.17.4"}

:optimizations

优化级别。可以是 :none:whitespace:simple:advanced。对于引导的 ClojureScript,仅支持 :none:simple

:none 是开发的推荐设置,而 :advanced 是生产的推荐设置,除非有某些因素阻止了它(不兼容的外部库、错误等)。

有关不同优化模式的详细说明,请参见 Closure Compiler 编译级别

node.js externs 也可以作为有用的示例。

当未使用 :main 选项 时,:none 需要手动代码加载,因此与其他选项相比需要一个单独的 HTML。

默认为 :none

:optimizations :none

:output-to

将要输出的 JavaScript 文件的路径。

:output-to "resources/public/js/main.js"

:output-dir

设置编译期间使用的临时文件的输出目录。默认为 "out"。

:output-dir "resources/public/js/out"

:preloads

开发 ClojureScript 通常需要开发时间仅有的副作用,例如启用打印、记录日志和连接 REPL。:preloads 允许在 cljs.core 之后立即加载此类副作用样板。例如,您可以创建一个开发命名空间,以便在浏览器中启用打印

(ns foo.dev)

(enable-console-print!)

现在,您可以使用以下编译器选项配置开发构建,以在您的主命名空间之前加载此副作用

{:preloads '[foo.dev]
 :main 'foo.core
 :output-dir "out"}

:preloads 必须是一系列符号,这些符号映射到类路径上可发现的现有命名空间。请注意,使用 Leiningen 时不需要前导引号 - project.clj 中的值隐式引用。

对于 :optimizations :none,必须指定 :main 选项才能使预加载生效。

:pretty-print

确定 JavaScript 输出是否以人类可读的方式制表。默认值为 false

:pretty-print false

:source-map

参见 源映射。在 :none 优化下,有效值为 truefalse,默认值为 true。在所有其他优化设置下,必须指定源映射将写入的位置。

:none

:source-map false

否则

:source-map "path/to/source/map.js.map"

:stable-names

确保高级构建之间的名称 churn 减少,从而在使用 :modules 时实现正确的供应商化。

:stable-names true

:target

有效选项为 :nodejs:webworker:bundle:none

默认值(未指定 :target)表示目标为浏览器。

查看 此处,了解有关如何在 nodejs 中运行代码的更多信息。

:webworker 生成适合使用 Web Workers 加载的引导脚本。

:bundle 目标是为了支持 node_modules 中的依赖项。由 ClojureScript 生成的输出需要传递给其他 JavaScript 工具(例如 Webpack、Metro),这些工具可以处理为这些依赖项生成的 Node.js 风格的 require 导入。

:none 目标会导致生成不依赖于任何特定执行环境的输出。

:target :nodejs

:verbose

从编译器活动中发出详细信息和测量结果。

:verbose true

不太常见的选项

:anon-fn-naming-policy

Google Closure 编译器如何对作为赋值和变量声明中的 r 值出现的匿名函数进行命名的策略。默认值为 :off

:anon-fn-naming-policy :unmapped

支持以下值

  • :off 不要给匿名函数命名。

  • :unmapped 生成基于赋值左侧的名称。在变量和属性重命名之后运行,因此生成的名称将很短且会被混淆。

  • :mapped 生成简短的唯一名称,并提供从这些名称到基于赋值左侧的更有意义的名称的映射。

:aot-cache

如果 ClojureScript 通过 cljs.main 使用,则默认为 true,否则为 false,或者如果 ClojureScript 用作 git 依赖项。控制是否使用共享 AOT 缓存来处理从 JAR 生成的编译器工件。

:aot-cache true

:browser-repl

自动注入标准浏览器 REPL 所需的组件。在启动浏览器 REPL 时,此项默认为 true。

:browser-repl true

:cache-analysis

实验性功能。将编译器分析缓存到磁盘。这使得冷构建和 REPL 启动时间更快。

对于 REPL,默认为 true。否则,当且仅当 :optimizations:none 时,默认为 true

:cache-analysis true

:closure-defines

设置使用 @definecljs.core/goog-define 辅助宏注释的 Closure 库的变量的值。常见用法是将 goog.DEBUG 设置为 false

:closure-defines {"goog.DEBUG" false}

你也可以使用符号

:closure-defines {my.cool-ns/some-def true}

请注意,在使用 Lein 时,由于隐式引用,引号是不必要的。

对于 :optimizations :none,必须指定 :main 选项才能使定义生效,并且仅影响 goog-define 定义。:closure-defines 目前对 :optimizations :whitespace 没有任何影响。

你可以在 :closure-defines 中设置的变量中使用 ifcondidentical? 比较相结合来消除代码中的部分代码(DCE)。但是,要这样做,你必须使用 ifcondidentical? 比较相结合。任何其他形式(如 casecondp)在运行时将正常工作,但 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-extra-annotations

定义 Closure 库可能使用的额外 JSDoc 注释,以使它们不会触发编译器警告。

:closure-extra-annotations #{"api"}

:closure-output-charset

配置输出字符集。可以是

  • iso-8859-1

  • us-ascii

  • utf-16

  • utf-16be

  • utf-16le

  • utf-8

默认为 utf-8

:closure-output-charset "iso-8859-1"

:closure-warnings

配置 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-stats

报告有关编译器活动的计时基本测量结果。

默认为 false

:compiler-stats true

:deps-cmd

设置安装 node_modules 的命令。仅支持 "npm""yarn"

:deps-cmd "yarn"

:elide-asserts

此标志将导致所有 (assert x ) 调用在编译期间被删除,包括与 :pre:post 条件相关的隐式 assert。对生产环境有用。即使在高级编译中,默认值也始终为 false。不指定 goog.asserts.ENABLE_ASSERTS,它是不同的,并且由 Closure 库使用。

请注意,使用 JVM ClojureScript 时,无法在运行时将 *assert* 动态设置为 false;必须明确使用此编译器标志才能实现省略。另一方面,使用自托管 ClojureScript 时,设置 *assert* 将导致省略 asserts,就像在 Clojure 中一样。

:elide-strict

是否省略 JavaScript 输出中的 use strict 语句。默认为 true

:elide-strict false

:fingerprint

默认为 false。是否启用指纹识别,这将在输出文件名后追加内容 SHA。将为 :output-dir 生成 manifest.edn 用于映射指纹文件名称。当使用 :modules:source-map 选项时,这特别有用,因为指纹文件名称将被适当地引用。

:fingerprint true

:fn-invoke-direct

需要 :static-fns true。此选项发出略微不同的代码,可以将代码速度提高 10-30%。未实现 IFn 协议的高阶函数通常使用 f.call(null, arg0, arg1 …​) 调用。启用此选项后,编译器将使用更快的 f(arg0, arg1 …​ 来调用它们。

:fn-invoke-direct 功能处于 Alpha 状态。对于某些库(例如 Reagent),已知 :fn-invoke-direct 会生成不正确的代码。

:fn-invoke-direct true
:elide-asserts true

:hashbang

使用 :target :nodejs 时,编译器将在编译后的源代码的第一行发出 shebang,使其可执行。当你的目的是构建 node.js 模块而不是可执行文件时,请使用此选项删除 shebang。

:hashbang false

:infer-externs

启用自动为与 JavaScript 的互操作调用生成 externs。默认为 false。有关更多信息,请参见 Externs (Alpha)

:infer-externs true

:language-in 和 :language-out

配置 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

:libs

添加对外部 js 库的依赖项,即与 Google Closure 兼容的 javascript 文件,具有正确的 goog.provides()goog.requires() 调用。请注意,这些目录中的文件将被监视,如果它们被修改,则会发生重建。

可以给出路径或文件名。相对路径相对于当前工作目录(通常是项目根目录)。

默认为空向量 []

:libs ["closure/library/third_party/closure"
       "src/js"
       "src/org/example/example.js"]

:nodejs-rt

禁用 Node.js 运行时支持的标志。在不以 Node.js 为目标,而是以了解 Node.js 风格 require 约定的 JavaScript 工具为目标时有用

:nodejs-rt false

:optimize-constants

当设置为 true 时,常量(如关键字和符号)将只创建一次,并将写入到单独的文件(cljs/core/constants.js)中。编译器将发出对常量的引用,该常量在常量表中定义,而不是为其创建一个新对象。此选项主要用于发布版本,因为它可以减少分配,从而提高性能。在 :advanced 优化下默认为 true,否则为 false

:optimize-constants true

:output-wrapper

包装 Javascript 输出以避免覆盖全局变量。有四种可能的 value 类型

  1. 函数 - 接受一个参数,即编译后的 javascript 输出。应返回其他有效的 javascript 输出。对于最简单的情况,只需将 javascript 输出与类似于 #3(默认包装器)的内容字符串连接起来。

  2. 字符串 - 一些 format 插值兼容的字符串。例如,"(function(){%s};)()"format 以编译后的 javascript 输出作为第二个参数,其他参数则没有。

  3. 真值 - 使用默认的 (function(){…​};)() 包装。

  4. 假值 - 不要包装。这是默认值。

;; function
(fn [js-output]
  (str "(function(){" js-output "};).call(window);"))

;; string
"(function(){%s};).call(window);"

;; truthy
true

;; falsey
false

:package-json-resolution

配置在解析 NPM 包(以及它们之间)的依赖项时使用哪些 package.json 条目(例如 "browser""module""main")。

默认为

  • :nodejs (["main"]) 如果 :target:nodejs

  • :webpack (["browser", "module", "main"]) 否则

也可以接受自定义条目向量,例如 ["browser", "main"]

:parallel-build

当设置为 true 时,并行编译源代码,利用多个核心。

:parallel-build true

:preamble

将给定文件的原始内容预先附加到每个输出文件中。文件应位于类路径上。仅对 :none 以外的优化有效。

默认为空向量 []

:preamble ["license.js"]

确定是否在 JavaScript 中输出注释,这些注释可用于确定编译代码的原始来源。

默认为 false。

:print-input-delimiter false

:process-shim

默认为

  • false 如果 :target:nodejs

  • true 否则

自动为 Node.js process.env 提供一个 shim,其中包含一个 Google Closure 定义,NODE_ENV 的默认值为 "development"。在生产环境中,NODE_ENV 将被设置为 "production"。如果设置为 false,则所有声明的行为都将被禁用。

:pseudo-names

使用 :advanced 模式优化时,确定是否发出可读名称。这在调试优化后的 JavaScript 中遇到的问题时很有用,可以帮助找到缺少的 externs。默认为 false。

:pseudo-names true

:recompile-dependents

为了正确性,ClojureScript 编译器现在始终在父命名空间更改时重新编译依赖的命名空间。这可以防止构建损坏和警告被吞没。但是,这会影响编译时间,具体取决于应用程序的结构。此选项默认为 true

:recompile-dependents false

:rename-prefix

指定一个前缀,该前缀将被附加到所有变量。当使用代码拆分时,可以使用它来防止与 JavaScript 全局范围内的其他代码发生冲突。

:rename-prefix "prefix"

:rewrite-polyfills

如果设置为 true,则 Google Closure Compiler 将添加 polyfills(例如,当您使用原生 JavaScript Promise 时)。**这需要将:language-in设置为:es6或更高版本,否则将被静默忽略!**

:language-in  :es6
:rewrite-polyfills true

:source-map-asset-path

对附加到生成 JavaScript 文件的sourceMappingURL注释提供精细控制,当启用源映射时。

:source-map-path

设置源映射中引用的源文件的路径,以避免进一步的 Web 服务器配置。

:source-map-path "public/js"

此选项影响发出的源映射 V3 JSON 文件的sources条目。

:source-map-asset-path "http://foo.com/public/js/out"

:source-map-timestamp

在源映射 URL 中添加缓存清除时间戳。这有助于在实时重新加载代码时保持源映射最新。

:source-map-timestamp true

:spec-skip-macros

是否禁用规范宏检查。默认值为false

:spec-skip-macros true

:static-fns

将静态调度应用于发出的 JavaScript 中的特定函数元数,而不是使用call构造。默认情况下为 false,除非在高级优化下。对于 REPL 开发设置为 false 有用,以方便函数重新定义,而对于发布设置为 true 有用以提高性能。

此设置不适用于标准库,该库始终隐式将:static-fns设置为 true 进行编译。

:static-fns true

要为对已声明函数的调用启用静态调度,请提供:arglists元数据。例如,如果(declare foo)(foo 1 2)之前,将使用动态调度。如果改为(declare ^{:arglists '([x y])} foo)(foo 1 2)之前,如果启用了:static-fns,则将使用静态调度。

:target-fn

设置一个任意的 Clojure 函数来生成开发主要入口 JavaScript 文件。必须是代表类路径上命名空间中存在的 Clojure 函数的符号。仅在:optimization :none下使用。

:target-fn 'some.custom.dev-bootstrap

:warnings

此标志将打开/关闭编译器对未声明变量、错误函数调用元数等的引用警告。可以是布尔值,用于启用/禁用常见警告,也可以是包含特定警告键和相关布尔值的映射。默认值为 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-accessagetaset的无效使用

  • :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,不支持的外部库预处理值

:watch-fn

是成功构建后将调用的函数。

仅适用于cljs.build.api/watch

:watch-fn (fn [] (println "Updated build"))

:warning-handlers

设置一个处理程序向量来定制对发出的警告的处理。处理程序应该是一个符号(解析为函数)或一个函数。每个函数的签名为[warn-type env warn-info]warn-type是一个关键字,描述了警告env是分析环境,warn-info是一个包含特定警告类型的额外有用信息的映射。

默认为

:warning-handlers [cljs.analyzer/default-warning-handler]