Cada función y variable que creo en el proyecto KotlinJs entra en un módulo. Pero necesito definir algunas funciones en el ámbito global.
Uso la biblioteca p5js (js puro). Permite al usuario definir funciones de manejo de eventos en el ámbito global. Estoy tratando de usar KotlinJS en este proyecto. Pero no sé cómo crear funciones globales para manejar los eventos de p5js. Todas mis funciones de Kotlin están dentro del módulo. Y para llamar a mi código Kotlin necesito especificar el nombre completo mymodule.draw()
Actualmente tengo que hacer una capa adicional de código JS puro con funciones globales que traduzcan la ejecución a funciones de kotlin que se ve así:
function setup() { mymodule.setup(); } function draw() { mymodule.draw(); }El problema con este enfoque es una gran cantidad de código estándar y repetitivo.
En caso de que esto sea útil para alguien, dejaré otra solución aquí:
import kotlin.browser.window fun main() { window.asDynamic()["setup"] = ::setup window.asDynamic()["draw"] = ::draw } fun setup() {} fun draw() {}Lo que realmente hace, crea funciones en el módulo kotlin como de costumbre y luego las asigna al objeto de ventana, lo que lo hace global.
Esta solución aún no es ideal, ya que necesita una asignación manual para cada función. Al menos lo hace bien en el proyecto Kotlin, no es necesario mantener un archivo js puro separado. Tal vez sea posible crear una anotación y aprovechar la reflexión de kotlin (no tengo idea de cómo se admite en KotlinJS).
Aunque esta solución funciona para mí, me gustaría tener una solución lista para usar como lo hacen para las funciones @JsNonModule external .
Desafortunadamente, no hay forma de definir la función global en Kotlin/JS. Es posible usar el tipo de módulo simple donde tiene símbolos globales en el objeto del módulo que se define en el alcance global.
// module M fun foo() {} al que se puede acceder a través M.foo
Agregando además de la respuesta de @Sergey, también se puede usar este trabajo cuando se trata de bibliotecas como p5.js
fun main() { window.asDynamic().setup = { // your setup code here } window.asDynamic().draw = { // your draw code here } }Este enfoque minimiza la definición y la declaración de las dos funciones (mirando su lenguaje C). Gracias