您好,我正在 Node 上开始使用 KotlinJS,我已经放置了一个非常简单的 kotlin 文件,我想使用原始kotlinc-js编译器来编译它。不使用gradle
package main
fun heavy() {
(1..10_000_000).forEach { it*it }
}
fun main() {
heavy()
println("Bye JS")
}
Run Code Online (Sandbox Code Playgroud)
这是make我尝试过但没有成功的命令:
build-js:
kotlinc-js main.kt -output main.kt.js
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但是当我尝试运行时node main.kt.js:
throw new Error("加载模块'main.kt'时出错。未找到其依赖项'kotlin'。请检查'kotlin'是否在'main.kt'之前加载。"); ^
错误:加载模块“main.kt”时出错。未找到其依赖项“kotlin”。请检查“kotlin”是否在“main.kt”之前加载。在对象。(/home/nanospicer/KotlinProjects/KotlinScripting/main.kt.js:2:9) 在 Module._compile (节点:internal/modules/cjs/loader:1101:14) 在 Object.Module._extensions..js (节点:内部/模块/cjs/loader:1153:10)在Module.load(节点:内部/模块/cjs/loader:981:32)在Function.Module._load(节点:内部/模块/cjs/loader:822) :12) 在 Function.executeUserEntryPoint [作为 runMain] (节点:internal/modules/run_main:79:12) 在节点:internal/main/run_main_module:17:47
好的,所以我认为它缺少 kotlin 运行时。我将尝试与 JVM 编译器相同的参数:-include-runtime这会导致错误:
错误:无效参数:-include-runtime 信息:使用 -help 获取更多信息
然后我尝试:
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
Run Code Online (Sandbox Code Playgroud)
但它仍然会导致同样的错误。我也尝试删除该libraries标志,但它也不起作用
我已经找到罪魁祸首了
我基本上nodejs从 IntelliJ IDEA 创建了一个项目,并快速阅读了 gradle 任务,这暗示我它正在为我准备一个节点环境。
我快速浏览了一下 npm.js,发现实际上有一个名为的包kotlin,它是编译器的 javascript stdlib。
我最终调整了 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")
}
Run Code Online (Sandbox Code Playgroud)
使用 npm安装kotlinstdlib:
$ npm i kotlin --save
Run Code Online (Sandbox Code Playgroud)
我的 Makefile 构建命令如下所示:
$ kotlinc-js main.kt -module-kind commonjs -main call -output main.kt.js
Run Code Online (Sandbox Code Playgroud)
论点的一个小细节:
-module-kind commonjs它告诉编译器为节点项目生成代码风格(不完全是,但你明白了要点)-main call确定编译后的模块是否应调用 main 函数。这是因为如果我们将该值设置为,noCall我们将不会运行 main 函数,它的行为可能就像一个库。-output main.kt.js这个名字是我自己选择的,没有任何理由,只要它是一个 .js 文件,你就可以运行它,但我想保持这样,以便将它与main.js我生成的另一个文件进行比较!| 归档时间: |
|
| 查看次数: |
1949 次 |
| 最近记录: |