如果我有一个myfile.js
如下调用的 JavaScript 文件:
function myJsFunc() { return "Hello from JavaScript"; }
如何将此文件导入 Kotlin/JS 项目并myJsFunc()
从 Kotlin 代码调用?
如果我有一个myfile.js
如下调用的 JavaScript 文件:
function myJsFunc() { return "Hello from JavaScript"; }
如何将此文件导入 Kotlin/JS 项目并myJsFunc()
从 Kotlin 代码调用?
从闲散的讨论中复制过来
首先你需要在 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
您可能会在文档中找到一些有趣的信息: 使用 Kotlin 中的 JavaScript。
本质上,您需要external
手动编写声明来告诉 Kotlin 应该在 JS 中可用的函数和类型。
使文件本身可用取决于您的构建和部署代码的方式。