【问题标题】:Load resource file (json) in kotlin js在 kotlin js 中加载资源文件(json)
【发布时间】:2019-08-02 08:13:59
【问题描述】:

鉴于此代码,我应该将 file.json 放在哪里才能在运行时中找到?

// path: src/main/kotlin/Server.kt
fun main() {
  val serviceAccount = require("file.json")
}

我尝试将它放在 src/main/resources/ 下,但没有运气。我还使用 Gradle 将 kotlin 编译为带有 kotlin2js 插件的 js。

【问题讨论】:

  • 这段代码会运行在服务器端(NodeJS)还是客户端?
  • @AlexanderEgger 服务器端,因此(更容易)保证路径
  • 只使用 gradle 无济于事,也可以使用 kotlin-frontend-plugin,在资源文件夹中找到你的 file.json 并观察奇迹发生
  • 你需要类似 json-loader 的 webpack 插件来加载带有代码的 json

标签: kotlin kotlin-multiplatform kotlin-js-interop kotlin-js kotlin2js


【解决方案1】:

假设 Kotlin 编译器将创建的 JS 文件(例如 server.js)放入默认位置 build/classes/kotlin/main,并将资源文件(file.json)放入 build/resources/main

你正在运行server.js,通过执行node build/classes/kotlin/main/server.js

根据 NodeJS 文档:

可以使用相对路径(例如 ./、./foo、./bar/baz、../foo)导入本地模块和 JSON 文件,该路径将针对 __dirname 命名的目录进行解析(如果已定义)或当前工作目录。 (https://nodejs.org/api/modules.html#modules_require_id)

在我们的例子中,__dirnamebuild/classes/kotlin/main

所以正确的require语句是:

val serviceAccount = js("require('../../../resources/main/file.json')") 

或者如果require 被定义为问题中的 Kotlin 函数

val serviceAccount = require("../../../resources/main/file.json") 

【讨论】:

    【解决方案2】:

    如果您在 Kotlin 中没有 require 函数的导入,则可以只使用 js("require('./file.json')")。结果将是dynamic,因此您可以将其转换为Map

    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.js/js.html

    【讨论】:

    • 如何解决这个问题?我看到require("file.json")js("require('file.json')") 都会生成相同的javascript 代码:require('file.json')。问题仍然存在,在路径中找不到 file.json。确切地说,有一个例外:Error: Cannot find module 'file.json'
    • 我猜./file.json 可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多