将代码转换为新的 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: []
};
我有一个简单的 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
下添加 - 添加任意名称的文件。例如
Temp.kt
- Copy-paste 以上代码来自问题
- 去终端和运行 gradle命令生成JS库
src/jsMain/kotlin
文件夹
./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: []
};