JavaScript DCE
自版本 1.1.4 起,Kotlin/JS 包含了一个无用代码消除(DCE,dead code elimination)工具。该工具允许在生成的 JS 中删除未使用的属性、函数和类。出现未使用的声明有这几种可能情况:
- 函数可以内联并且从未直接调用(除少数情况之外,这总会出现)。
- 你所使用的共享库提供了比实际需要更多的功能/函数。例如,标准库(kotlin.js)包含用于操作列表、数组、字符序列、DOM 适配器等的函数/功能,这些一起提供了大约 1.3 mb 的文件。一个简单的“Hello, world”应用程序只需要控制台程序,整个文件只有几千字节。
无用代码消除通常也称为“tree shaking”。
如何使用
DCE 工具目前对 Gradle 可用。
要激活 DCE 工具,请将以下这行添加到 build.gradle
中:
apply plugin: 'kotlin-dce-js'
请注意,如果你正在使用多项目构建,那么应该将插件应用在作为应用程序入口点的主项目。
默认情况下,可以在路径 $BUILD_DIR/min/
中找到生成的一组 JavaScript文件(你的应用程序与所有依赖关系),其中 $BUILD_DIR
是生成 JavaScript 的路径(通常是 build/classes/main
)。
配置
要在主源集上配置 DCE,可以使用 runDceKotlinJs
任务(以及用于其他源集对应的 runDce<sourceSetName>KotlinJs
)。
有时你直接在 JavaScript 中使用一个 Kotlin 声明,而被 DCE 给去除掉了。你可能想保留这个声明。 为此,你可以在 build.gradle
中使用以下语法:
runDceKotlinJs.keep "declarationToKeep"[, "declarationToKeep", ...]
其中 declarationToKeep
具有以下语法:
moduleName.dot.separated.package.name.declarationName
例如,考虑一个模块命名为 kotlin-js-example
,它在 org.jetbrains.kotlin.examples
包中包含一个名为 toKeep
的函数。使用以下这行:
runDceKotlinJs.keep "kotlin-js-example_main.org.jetbrains.kotlin.examples.toKeep"
请注意,如果函数具有参数,它的名称会被修饰,因此在 keep 指令中应该使用修饰后的名称。
开发模式
运行 DCE 在每次构建时会额外花费一些时间,而且输出大小在开发过程中无关紧要。可以通过 DCE 任务的 dceOptions.devMode
标志使 DCE 工具跳过实际的无效代码消除从而缩短开发构建时间。
例如,如需根据自定义条件禁用 main
源集的 DCE 并且总是禁用 test
代码的 DCE,请将下述几行添加到构建脚本中:
runDceKotlinJs.dceOptions.devMode = isDevMode
runDceTestKotlinJs.dceOptions.devMode = true
示例
显示如何将 Kotlin 与 DCE 及 webpack 集成并得到一个小的捆绑的完整示例,可以在这里找到。
注意事项
- 对于 1.1.x 版本,DCE 工具是一个 实验性的 功能。这并不意味着我们要删除它,或者它不能用于生产。这意味着我们可能更改配置参数的名称、默认设置等等。
- 目前,如果你的项目是共享库,那么不应使用 DCE 工具。它只适用于开发应用程序(可能使用共享库)时。原因是:DCE 不知道库的哪些部分会被用户的应用程序所使用。
- DCE 不会通过删除不必要的空格及缩短标识符来执行代码压缩(丑化)。对于此目的,你应该使用现有的工具,如 UglifyJS(https://github.com/mishoo/UglifyJS2 )或者 Google Closure Compiler(https://developers.google.com/closure/compiler/ )。
原文: https://hltj.gitbooks.io/kotlin-reference-chinese/content/txt/javascript-dce.html