kotlin-js - 如何将 Kotlin 文件编译为 JavaScript?

标签 kotlin-js kotlinc

您好,我开始在 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 确定编译后的模块是否应该调用主函数。这是因为如果我们将该值设置为 noCall,我们将不会运行 main 函数,它的行为可能就像一个库。
  • -output main.kt.js 这个名字我自己选的,没有任何理由,只要是.js文件就可以运行,但我想保持这样将它与我生成的另一个 main.js 文件进行比较!

关于kotlin-js - 如何将 Kotlin 文件编译为 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69428226/

相关文章:

Kotlinc 命令行错误

kotlin - kotlin 控制台中定义的变量范围是什么?

android - 从 kotlin REPL 和临时文件中使用 json 类时出错

javascript - 如何正确地从Kotlin.js开始

kotlin - Kotlin是如何专门编译的?

kotlin - 未定位浏览器时如何在Kotlin中调用诸如setTimeout之类的JS函数

javascript - 如何将 Kotlin 编译成 TypeScript?

kotlin - 在 kotlinc 的 jar 输出中包含反射库