【问题标题】:Is it possible to import a JavaScript file in a Kotlin/JS project?是否可以在 Kotlin/JS 项目中导入 JavaScript 文件?
【发布时间】:2021-07-09 00:24:03
【问题描述】:

如果我有一个名为 myfile.js 的 JavaScript 文件,如下所示:

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

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

【问题讨论】:

  • 也许你应该编辑你的问题以明确它是针对 Node.js 目标的。对于浏览器目标,这可以通过在 webpack.config.d 文件夹中添加进一步的调整来解决,正如 Joffrey 指出的那样。

标签: kotlin kotlin-js kotlin-js-interop


【解决方案1】:

从 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 版本协议使用包。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 嗨,是的,我已经多次阅读此页面。在external 声明中,它诱人地说,“当编译器看到这样的声明时,它假定相应类、函数或属性的实现是外部提供的(由开发人员或通过 npm 依赖项)”——没有解释如何提供实现。
    • @funkybro 这实际上取决于您如何构建代码以及文件来自何处。例如,如何将 Kotlin 编译的 JavaScript 文件包含到应用程序中?它是否包含在 HTML 页面中?如果是这样,并且如果您的 JS 文件是您的源代码的一部分,您可以从 HTML 中引用您的 JS 文件。如果你的 JS 来自 NPM 依赖,你可以使用 gradle 的 dependencies 块和 npm() 帮助器来获取它。
    • 感觉你问我的问题就是我想要回答的问题:) 如果有帮助,我的项目最终将在 Node.js 上而不是在浏览器中运行。不,它不是来自 NPM 依赖项。就像我在我的问题中所说的那样,这是一个我想要包含的简单 Javascript 文件。您问“如何包含 JavaScript 文件”?那是我的问题!例如,它可以从resources 文件夹中加载吗?如果没有,我该如何包含它?
    • @funkybro “你问如何包含 JS 文件,这是我的问题” - 实际上我问的是如何包含作为 Kotlin 源代码构建产品的 JS 文件,而不是包含您想用作依赖项。我假设您已经有了 Kotlin/JS 项目设置,只有 Kotlin 源代码,现在您正尝试添加一个 JS 文件作为依赖项。这就是为什么我会询问有关您设置 Kotlin/JS 项目的问题。
    • 如果它要在 nodejs 上运行,我假设你打算直接运行编译好的 Kotlin/JS 文件。我不太熟悉 Node 中的运行时依赖项管理,但我认为您可能必须将 JS 文件转换为模块并调整生成的 webpack 配置。不幸的是,我在那里没有太多经验,但您很可能会在 Kotlin/JS public slack 上找到帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2015-07-10
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多