Как вызвать функции Kotlin / JS из обычных Javascript? - PullRequest
1 голос
/ 12 февраля 2020

Я использую Kotlin для разработки небольшого программного обеспечения для 2D-моделирования, и я использую Kotlin мультиплатформенные проекты, чтобы он работал как на JVM, так и в браузере. Пока все работает хорошо.

Однако у меня возникает проблема, когда я хочу вызывать функции, определенные в Kotlin / JS, из обычного Javascript.

Чтобы заставить мое приложение работать в браузер, я включаю большой файл JS, который находится в папке «build / Distribution» после запуска задачи «build» Gradle. Когда мое приложение Kotlin / JS содержит функцию main () , оно автоматически вызывается при открытии страницы HTML, ссылающейся на файл JS, и она работает хорошо.

Но если я удаляю основную функцию и вместо этого создаю функцию start () , которая должна вызываться вручную (например, после нажатия на кнопку), она не работает: она говорит, что функция start () не определена, даже если она объявлена ​​в коде Kotlin.

После открытия сгенерированного файла JS кажется, что на самом деле * 1015 нет * start () функция. Похоже, что все имена функций были уменьшены.

Я пытался добавить @ JsName , но это ничего не изменило.

Так что, думаю, я ' Я делаю что-то не так, но я действительно не знаю, что и как заставить это работать.

Примечание: я использую Kotlin 1.3.70

РЕДАКТИРОВАТЬ: Вот ядро из моего build.gradle.kts:

plugins {
    kotlin("js") version "1.3.70-eap-184"
}


repositories {
    mavenLocal()
    mavenCentral()

    maven(url = "https://dl.bintray.com/kotlin/kotlin-eap")
}

dependencies {

}

kotlin {
    target {
        nodejs {

        }
        browser {
            webpackTask {
                mode = org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode.PRODUCTION
                bin = "$projectDir/node_modules/$bin"
            }
        }
    }
}

1 Ответ

2 голосов
/ 12 февраля 2020

Вы должны вызвать функцию с именем модуля и квалифицированным именем:

https://kotlinlang.org/docs/reference/js-to-kotlin-interop.html#package -структура

package my.qualified.packagename

fun foo() = "Hello"
alert(myModule.my.qualified.packagename.foo());

https://kotlinlang.org/docs/reference/js-to-kotlin-interop.html#jsname -annotation

В некоторых случаях (например, для поддержки перегрузок) компилятор Kotlin отображает имена сгенерированных функций и атрибутов в коде JavaScript. Для управления сгенерированными именами вы можете использовать аннотацию @JsName

UPD: у вас есть два способа изменить имя модуля:

1) Если вы используете gradle, вы можете добавить этот код к вашему build.gradle

compileKotlinJs {
    kotlinOptions.outputFile = "${rootDir}/web/app.js" // should be valid js variable name
}

или к вашему build.gradle.kts

kotlin {
    target {
        compilations.all {
            kotlinOptions.outputFile = "${rootDir}/web/app.js"
        }
    }
}

, в этом случае вы должны использовать сгенерированный файл (app.js) в папке web (вы можете использовать другие имена папок и файлов).

2) Вы должны создать папку webpack.config.d и создать файл js с любым именем и содержимым, которое настраивает режим библиотеки для webpack

config.output = config.output || {} // just in case where config.output is undefined
config.output.library = "libraryName" // should be valid js variable name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...