5

如果我有一个myfile.js如下调用的 JavaScript 文件:

function myJsFunc() { return "Hello from JavaScript"; }

如何将此文件导入 Kotlin/JS 项目并myJsFunc()从 Kotlin 代码调用?

4

2 回答 2

1

从闲散的讨论中复制过来


首先你需要在 gradle 中声明一个 npm 依赖

kotlin.sourceSets.named("jsMain") {
  dependencies {
    implementation(npm("package-name", "version"))
  }
}

然后,您可以使用./gradlew generateExternals并祈祷 dukat 有效,也可以自己编写外部声明。

package-name并且version看起来与 package.json 中的相同,因此file:xxx也支持所有类似的协议。

您也可以使用本地 TS 源破解它,但我不推荐它。如果您仍然必须坚持使用它,请在您的 repo 的某处创建一个小型 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./gradlew pack gradle 插件提供的任务(配置自己,只需应用它)并通过版本协议使用包在你的 js/ts package.json 中。file:xxx

于 2021-07-08T16:18:30.887 回答
-2

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

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

使文件本身可用取决于您的构建和部署代码的方式。

于 2021-05-23T15:02:42.917 回答