Загрузить файл ресурсов (json) в kotlin js

Учитывая этот код, где я должен разместить файл .json, чтобы его можно было найти во время выполнения?

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

Я безуспешно пытался поместить его в src/main/resources/. Я также использую Gradle для компиляции kotlin в js с плагином kotlin2js.


person Diolor    schedule 11.03.2019    source источник
comment
Будет ли этот код работать на стороне сервера (NodeJS) или на стороне клиента?   -  person Alexander Egger    schedule 26.03.2019
comment
@AlexanderEgger на стороне сервера, поэтому путь (проще) гарантирован   -  person Diolor    schedule 27.03.2019
comment
использование только gradle не поможет, используйте также плагин kotlin-frontend-plugin, найдите файл file.json в папке ресурсов и наблюдайте, как происходит волшебство   -  person andylamax    schedule 21.04.2019
comment
вам нужно что-то вроде плагина json-loader для веб-пакета, чтобы загрузить json с кодом   -  person Vlad    schedule 08.07.2020


Ответы (2)


Предположим, что компилятор Kotlin помещает созданный JS-файл (скажем, server.js) в папку по умолчанию build/classes/kotlin/main, а файл ресурсов (file.json) — в build/resources/main.

И вы запускаете server.js, выполняя node build/classes/kotlin/main/server.js

Согласно документации NodeJS:

Локальные модули и файлы JSON можно импортировать, используя относительный путь (например, ./, ./foo, ./bar/baz, ../foo), который будет сопоставлен с каталогом с именем __dirname (если он определен) или текущий рабочий каталог. (https://nodejs.org/api/modules.html#modules_require_id)

В нашем случае __dirname равно build/classes/kotlin/main

Итак, правильный оператор require:

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

или если require определено как функция Kotlin, как в вопросе

val serviceAccount = require("../../../resources/main/file.json") 
person Alexander Egger    schedule 27.03.2019

Вы можете просто использовать js("require('./file.json')"), если у вас нет импорта для функции require в Kotlin. Результатом будет dynamic, поэтому вы можете привести его к Map.

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

person Eugene Petrenko    schedule 11.03.2019
comment
Как решит вопрос? Я вижу, что либо require("file.json"), либо js("require('file.json')") будут генерировать один и тот же код JavaScript: require('file.json'). Проблема по-прежнему остается в том, что файл .json не может быть найден в пути. Чтобы быть точным, за исключением: Error: Cannot find module 'file.json' - person Diolor; 12.03.2019
comment
Думаю, тогда ./file.json может помочь - person Eugene Petrenko; 12.03.2019