将代码转换为新的 IR JS 编译器时出现问题

Problem while converting code to new IR JS Compiler

我有一个简单的 Kotlin 多平台库项目,它与 Legacy JS 编译器配合得很好,这里有一个简单的 class 代码:

package net.mggk.kwl

import kotlin.js.JsName

class CustomFunc {
    @JsName("sayHello")
    fun sayHello() {
        println("Hello from kotlin library :D")
    }
    @JsName("multiplyPerTwo")
    fun multiplyPerTwo(x: Int): Int {
        return 2 * x
    }
}

还有我的 gradle JS 配置:

js(LEGACY) {
    nodejs()
}

我目前正在尝试迁移到新的 IR 编译器,我已阅读迁移指南并将我的 gradle 配置更新为:

js(IR) {
    nodejs{}
    binaries.executable()
}

还有我的 class :

package net.mggk.kwl

import kotlin.js.JsExport

@kotlin.js.ExperimentalJsExport
@JsExport
class CustomFunc {
    fun sayHello() {
        println("Hello from kotlin library :D")
    }
    fun multiplyPerTwo(x: Int): Int {
        return 2 * x
    }
}

但是,使用这个新配置,编译器没有输出 JS 文件,存在 package.json 文件但没有 JS 文件。

如果有人知道如何解决这个问题,我目前正在寻找用 kotlin 编写跨平台库,但无法编译一个简单的 class 对我来说是死胡同。

感谢您的反馈。

创建项目和获得正确 JS 输出的步骤

工具:IntelliJ IDEA 2021.3.2

  • 创建一个新项目(Gradle基础+Kotlin/Multiplatform+Kotlin DSL构建脚本)
  • 加载初始设置后,在 build.gradle.kts
  • 中添加 js 目标
kotlin {
    js(IR) {
        nodejs()
        binaries.executable()
    }
    // ........
}
  • 添加jsMain 源集
sourceSets {
    // .....
    val jsMain by getting
}
  • root
  • 下添加 src/jsMain/kotlin 文件夹
  • 添加任意名称的文件。例如Temp.kt
  • Copy-paste 以上代码来自问题
  • 去终端和运行 gradle命令生成JS库
./gradlew jsNodeProductionRun
  • 转到build/js/packages/<YourLibName>/kotlin/

打开<YourLibName>.js文件,查看生成的JS代码

您会在问题

中找到 class 的 JS 代码
  function CustomFunc() {
  }
  CustomFunc.prototype.sayHello = function () {
    println('Hello from kotlin library :D');
  };
  CustomFunc.prototype.multiplyPerTwo = function (x) {
    return imul(2, x);
  };
  CustomFunc.$metadata$ = {
    simpleName: 'CustomFunc',
    kind: 'class',
    interfaces: []
  };