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



我有一个简单的Kotlin多平台库项目,它与LegacyJS编译器配合得很好,下面是一个简单类代码:

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
}
}

我的JS渐变配置:

js(LEGACY) {
nodejs()
}

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

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

我的课是:

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编写跨平台库,但无法编译一个简单的类对我来说是一条死胡同

感谢您的反馈。

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

工具:IntelliJ IDEA 2021.3.2

  • 创建一个新项目(基于Gradle+Kotlin/多平台+Kotlin DSL构建脚本(
  • 加载初始设置后,在build.gradle.kts中添加js目标
kotlin {
js(IR) {
nodejs()
binaries.executable()
}
// ........
}
  • 添加jsMain源集
sourceSets {
// .....
val jsMain by getting
}
  • root下添加src/jsMain/kotlin文件夹
  • 添加任意名称的文件。例如Temp.kt
  • 复制粘贴问题中的代码
  • 转到终端并运行gradle命令生成JS lib
./gradlew jsNodeProductionRun
  • 转到build/js/packages/<YourLibName>/kotlin/

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

你会在问题中找到类的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: []
};

最新更新