我有一个简单的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: []
};