如何将 Kotlin 文件编译为 JavaScript?
How to compile a Kotlin file to JavaScript?
你好,我开始在 Node 上使用 KotlinJS,我已经放置了一个非常简单的 kotlin 文件,我想使用原始 kotlinc-js
编译器编译它。 不使用 gradle
package main
fun heavy() {
(1..10_000_000).forEach { it*it }
}
fun main() {
heavy()
println("Bye JS")
}
这是我试过但没有成功的 make
命令:
build-js:
kotlinc-js main.kt -output main.kt.js
它编译得很好,但是当我尝试 运行 node main.kt.js
:
throw new Error("Error loading module 'main.kt'. Its dependency
'kotlin' was not found. Please, check whether 'kotlin' is loaded prior
to 'main.kt'."); ^
Error: Error loading module 'main.kt'. Its dependency 'kotlin' was not
found. Please, check whether 'kotlin' is loaded prior to 'main.kt'.
at Object. (/home/nanospicer/KotlinProjects/KotlinScripting/main.kt.js:2:9)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
at node:internal/main/run_main_module:17:47
好的,所以我认为它缺少 kotlin 运行时间。我将尝试与 JVM 编译器相同的参数:-include-runtime
导致错误:
error: invalid argument: -include-runtime
info: use -help for more information
然后我尝试了:
build-js:
kotlinc-js main.kt -kotlin-home "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/" -libraries "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar" -module-kind commonjs -main call -output main.kt.js
但还是报同样的错误。我也尝试删除 libraries
标志,但它也没有用
我找到了罪魁祸首。
我基本上从 IntelliJ IDEA 创建了一个 nodejs
项目,并快速阅读了 gradle 任务,这暗示我它正在为我准备一个节点环境。
我快速浏览了 npm.js,发现实际上有一个名为 kotlin
的包,它是 javascript 的编译器标准库。
我终于调整了我的 Makefile 上的构建命令以使用 common-js
的模块类型并且成功了!
//Definitive main.kt I ended up using
fun heavy() {
(1..100_000_000).forEach { it*it }
}
fun main() {
heavy()
println("Bye JS")
}
使用 npm 安装 kotlin
的标准库:
$ npm i kotlin --save
我的 Makefile 构建命令如下所示:
$ kotlinc-js main.kt -module-kind commonjs -main call -output main.kt.js
论点的细目分类:
-module-kind commonjs
它告诉编译器为节点项目生成代码样式(不完全是,但你明白了要点)
-main call
决定编译后的模块是否调用main函数。这是因为如果我们将值设置为 noCall
我们将不会 运行 main 函数,它的行为可能就像一个库。
-output main.kt.js
这个名字我自己随便取的,只要是.js文件你就可以运行但是我想保持这样比较到我正在生成的另一个 main.js
文件!
你好,我开始在 Node 上使用 KotlinJS,我已经放置了一个非常简单的 kotlin 文件,我想使用原始 kotlinc-js
编译器编译它。 不使用 gradle
package main
fun heavy() {
(1..10_000_000).forEach { it*it }
}
fun main() {
heavy()
println("Bye JS")
}
这是我试过但没有成功的 make
命令:
build-js:
kotlinc-js main.kt -output main.kt.js
它编译得很好,但是当我尝试 运行 node main.kt.js
:
throw new Error("Error loading module 'main.kt'. Its dependency 'kotlin' was not found. Please, check whether 'kotlin' is loaded prior to 'main.kt'."); ^
Error: Error loading module 'main.kt'. Its dependency 'kotlin' was not found. Please, check whether 'kotlin' is loaded prior to 'main.kt'. at Object. (/home/nanospicer/KotlinProjects/KotlinScripting/main.kt.js:2:9) at Module._compile (node:internal/modules/cjs/loader:1101:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12) at node:internal/main/run_main_module:17:47
好的,所以我认为它缺少 kotlin 运行时间。我将尝试与 JVM 编译器相同的参数:-include-runtime
导致错误:
error: invalid argument: -include-runtime info: use -help for more information
然后我尝试了:
build-js:
kotlinc-js main.kt -kotlin-home "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/" -libraries "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar" -module-kind commonjs -main call -output main.kt.js
但还是报同样的错误。我也尝试删除 libraries
标志,但它也没有用
我找到了罪魁祸首。
我基本上从 IntelliJ IDEA 创建了一个 nodejs
项目,并快速阅读了 gradle 任务,这暗示我它正在为我准备一个节点环境。
我快速浏览了 npm.js,发现实际上有一个名为 kotlin
的包,它是 javascript 的编译器标准库。
我终于调整了我的 Makefile 上的构建命令以使用 common-js
的模块类型并且成功了!
//Definitive main.kt I ended up using
fun heavy() {
(1..100_000_000).forEach { it*it }
}
fun main() {
heavy()
println("Bye JS")
}
使用 npm 安装 kotlin
的标准库:
$ npm i kotlin --save
我的 Makefile 构建命令如下所示:
$ kotlinc-js main.kt -module-kind commonjs -main call -output main.kt.js
论点的细目分类:
-module-kind commonjs
它告诉编译器为节点项目生成代码样式(不完全是,但你明白了要点)-main call
决定编译后的模块是否调用main函数。这是因为如果我们将值设置为noCall
我们将不会 运行 main 函数,它的行为可能就像一个库。-output main.kt.js
这个名字我自己随便取的,只要是.js文件你就可以运行但是我想保持这样比较到我正在生成的另一个main.js
文件!