JavaScript 无用代码消除(DCE)

Kotlin/JS Gradle 插件包含一个无用代码消除DCE)工具。 无用代码消除通常也称为 摇树。 通过删除未使用的属性、函数和类,它减小了大小或生成的 JavaScript 代码。

在以下情况下会出现未使用的声明:

  • 函数是内联的,永远不会直接调用(除了少数情况总是发生)。
  • 模块使用共享库。没有 DCE 的情况下,未使用的组件仍会进入结果包。 例如,Kotlin 标准库中包含用于操作列表、数组、字符序列、DOM 适配器的函数。 All of this functionality would require about 1.3 MB as a JavaScript file. 一个简单的 “Hello, world” 应用程序仅需要控制台例程,整个程序只有几 KB。

Kotlin/JS Gradle 插件在构建生产包时会自动处理 DCE,例如:使用 browserProductionWebpack 任务。开发包任务(例如 browserDevelopmentWebpack)不包含 DCE。

从 DCE 排除的声明

有时,即使未在模块中使用函数或类,也可能需要在结果 JavaScript 代码中保留一个函数或一个类, 例如:如果要在客户端 JavaScript 代码中使用它,则可能会保留该函数或类。

为了避免某些声明被删除,请将 dceTask 代码块添加到 Gradle 构建脚本中,并将这些声明列为 keep 函数的参数。 参数必须是声明的完整限定名,并且模块名称为前缀: moduleName.dot.separated.package.name.declarationName

函数与模块名称在生成的 JavaScript 代码中会被修饰,除非指定了其他名称。为了避免消除这些函数,请在 keep 参数中使用修饰的名称——就是出现在所生成 JavaScript 代码中的名称。

  1. kotlin {
  2. js {
  3. browser {
  4. dceTask {
  5. keep("myKotlinJSModule.org.example.getName", "myKotlinJSModule.org.example.User" )
  6. }
  7. binaries.executable()
  8. }
  9. }
  10. }

If you want to keep a whole package or module from elimination, you can use its fully qualified name as it appears in the generated JavaScript code.

Keeping whole packages or modules from elimination can prevent DCE from removing many unused declarations. Because of this, it is preferable to select individual declarations which should be excluded from DCE one by one.

Disabling DCE

To turn off DCE completely, use the devMode option in the dceTask:

  1. kotlin {
  2. js {
  3. browser {
  4. dceTask {
  5. dceOptions.devMode = true
  6. }
  7. }
  8. binaries.executable()
  9. }
  10. }