在Kotlin/JS项目中导入JavaScript文件是否可行?

10
如果我有一个名为myfile.js的JavaScript文件,其内容如下:
function myJsFunc() { return "Hello from JavaScript"; }

我该如何将这个文件导入到Kotlin/JS项目中,并从Kotlin代码中调用myJsFunc()


也许你应该编辑你的问题,明确它是针对 Node.js 目标的。对于浏览器目标,可以像 Joffrey 指出的那样,在 webpack.config.d 文件夹中添加进一步的调整来解决这个问题。 - Shreck Ye
Dukat在最近的版本中已经从Kotlin Gradle插件中移除,因为它不够可靠,无法发挥实际作用。团队正在重新考虑方法,在重新集成之前。 - Martynas Petuška
2个回答

4

从slack复制过来 discussion


首先,您需要在gradle中声明一个npm依赖项。
kotlin.sourceSets.named("jsMain") {
  dependencies {
    implementation(npm("package-name", "version"))
  }
}

然后,你可以使用./gradlew generateExternals,并祈祷Dukat能够正常工作,或者自己编写外部声明。

package-nameversion与package.json中的相同,因此所有协议(如file:xxx)也都受支持。

您还可以使用本地TS源进行修改,但我不建议这样做。如果您仍然必须坚持,可以在存储库的某个位置创建一个小型npm模块,并使用file:path/to/that/module版本。我建议在gradle中生成该模块的绝对路径,而不是尝试从kotlin插件生成的package.json计算相对路径。

kotlin.sourceSets.named("jsMain") {
  dependencies {
    val pathToLocalNpmModule = rootProject.projectDir.resolve("js/my-module").canonicalPath
    implementation(npm("my-module", "file:$pathToLocalNpmModule"))
  }
}

最后,对于那个特定的函数,Kotlin 的外部声明应该像这样(假设您将 package.json#main 字段直接指向那个 js 文件)。
// Explicit export
export function myJsFunc() { return "Hello from JavaScript"; }

// Default export
export default myJsFunc

// Explicit export
@JsModule("my-module")
public external fun myJsFunc(): String

// Default export
@JsModule("my-module")
@JsName("default")
public external fun myJsFunc(): String

现在,如果您想将您的Kotlin/JS Gradle模块集成到本地JS/TS项目中,我建议只使用npm-publish Gradle插件提供的./gradlew pack任务(自动配置,只需应用即可),并在您的js/ts package.json中通过file:xxx版本协议使用捆绑包。

有没有关于如何在Gradle中使用Dukat的文档?我找不到任何东西。搜索./gradlew generateExternals没有结果。能够通过Gradle任务生成Kotlin绑定将非常方便。 - mdornfe1

-2

您可能会在文档中找到一些有趣的信息: 从Kotlin使用JavaScript

基本上,您需要手动编写external声明,告诉Kotlin哪些函数和类型应该在JS中可用。

文件本身的可用性取决于您的构建方式以及如何部署代码。


2
嗨,是的,我已经多次阅读了这个页面。关于“external”声明,它令人着迷地说:“当编译器看到这样的声明时,它会假定相应类、函数或属性的实现是由开发者或通过npm依赖项提供的”,但没有解释如何提供实现。 - funkybro
@funkybro 这将取决于您如何构建代码以及文件来自何处。例如,您如何将从Kotlin编译的JavaScript文件包含到应用程序中?它是否包含在HTML页面中?如果是这样,并且您的JS文件是源代码的一部分,则可以从HTML引用您的JS文件。如果您的JS来自NPM依赖项,则可以使用gradle的dependencies块和npm()助手来获取它。 - Joffrey
3
感觉你问我的问题正是我想知道答案的问题 :) 如果有帮助的话,我的项目最终会在 Node.js 上运行,而不是在浏览器中运行。它不是来自于 NPM 依赖。就像我在问题中所说的那样,它是一个简单的 JavaScript 文件,我想要包含它。你问“如何包含这个JavaScript文件”?那就是我的问题!它可以从resources文件夹加载吗?如果不能,我该如何包含它? - funkybro
@funkybro,“你问如何包含JS文件,这就是我的问题” - 实际上我问的是如何包含作为Kotlin源代码构建产品的JS文件,而不是您想要用作依赖项的JS文件。我假设您已经设置了Kotlin/JS项目,并且只有Kotlin源代码,现在您正在尝试添加JS文件作为依赖项。这就是为什么我会询问关于您的Kotlin/JS项目设置的问题。 - Joffrey
1
如果它将在nodejs上运行,我认为您打算直接运行编译后的Kotlin / JS文件。 我不太了解Node中的运行时依赖项管理,但我认为您可能需要将JS文件转换为模块并调整生成的webpack配置。 不幸的是,我在这方面没有太多经验,但您很可能可以在Kotlin/JS public slack上找到帮助。 - Joffrey
目前我只是使用 ./gradlew nodeRun 运行我的项目,但并不出奇地它找不到我的 external 函数。我猜我需要把 JS 文件放在某个可以被找到的地方(哪里?),并且包含 @JSModule 或类似的注释来指向文件名和文件内的函数(具体是什么?)。 - funkybro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接