Puede compilar sus proyectos de Kotlin en módulos JavaScript para varios sistemas de módulos populares. Actualmente admitimos las siguientes configuraciones para módulos JavaScript:

  • Definiciones de módulos unificados (UMD), que es compatible con ambos AMD y CommonJS. Los módulos UMD también pueden ejecutarse sin ser importados o cuando no hay un sistema de módulos presente. Esta es la opción predeterminada para browser y nodejs objetivos.
  • Definiciones de módulos asíncronos (AMD), que es utilizado en particular por el RequireJS Biblioteca.
  • CommonJS, ampliamente utilizado por Node.js / npm (require función y module.exports objeto)
  • Sencillo. No compile para ningún sistema de módulos. Puede acceder a un módulo por su nombre en el ámbito global.

Apuntando al navegador

Si está apuntando al navegador y desea utilizar un sistema de módulo diferente al de UMD, puede especificar el tipo de módulo deseado en el webpackTask bloque de configuración. Por ejemplo, para cambiar a CommonJS, use:

kotlin 
    js 
        browser 
            webpackTask 
                output.libraryTarget ="commonjs2"
        binaries.executable()

Webpack proporciona dos “sabores” diferentes de CommonJS, commonjs y commonjs2, que afectan la forma en que sus declaraciones están disponibles. Aunque en la mayoría de los casos, probablemente desee commonjs2, que agrega el module.exports sintaxis a la biblioteca generada, también puede optar por el “puro” commonjs opción, que implementa la especificación CommonJS exactamente. Para aprender más sobre la diferencia entre commonjs y commonjs2, cheque aquí.

Creación de bibliotecas JavaScript y archivos Node.js

Si está creando una biblioteca que se consumirá desde JavaScript o un archivo Node.js y desea utilizar un sistema de módulos diferente, las instrucciones son ligeramente diferentes.

Elección del sistema de módulos de destino

Para seleccionar el tipo de módulo, configure el moduleKind opción del compilador en el script de compilación de Gradle.

compileKotlinJs.kotlinOptions.moduleKind ="commonjs"
tasks.withType(KotlinJsCompile::class.java).named("compileKotlinJs")
    kotlinOptions.moduleKind ="commonjs"

Los valores disponibles son: umd (defecto), commonjs, amd, plain.

Esto es diferente de ajustar webpackTask.output.libraryTarget. El destino de la biblioteca cambia la salida generado por webpack (después de que su código ya haya sido compilado). kotlinOptions.moduleKind cambia la salida generada por el compilador de Kotlin.

En Kotlin Gradle DSL, también hay un atajo para configurar el tipo de módulo CommonJS:

kotlin 
    js useCommonJs()// . . .

@JsModule anotación

Para decirle a Kotlin que un external clase, paquete, función o propiedad es un módulo de JavaScript, puede utilizar @JsModule anotación. Considere que tiene el siguiente módulo CommonJS llamado “hola”:

module.exports.sayHello=function(name)alert("Hello, "+ name);

Deberías declararlo así en Kotlin:

@JsModule("hello")externalfunsayHello(name: String)

Aplicando @JsModule a los paquetes

Algunas bibliotecas de JavaScript exportan paquetes (espacios de nombres) en lugar de funciones y clases. En términos de JavaScript, es un objeto que tiene miembros que son clases, funciones y propiedades. La importación de estos paquetes como objetos de Kotlin a menudo parece poco natural. El compilador puede mapear paquetes JavaScript importados a paquetes Kotlin, usando la siguiente notación:

@file:JsModule("extModule")package ext.jspackage.name

externalfunfoo()externalclass C

donde el módulo de JavaScript correspondiente se declara así:

module.exports =
    foo:/* some code here */,C:/* some code here */

archivos marcados con @file:JsModule la anotación no puede declarar miembros no externos. El siguiente ejemplo produce un error en tiempo de compilación:

@file:JsModule("extModule")package ext.jspackage.name

externalfunfoo()funbar()="!"+foo()+"!"// error here

Importar jerarquías de paquetes más profundas

En el ejemplo anterior, el módulo JavaScript exporta un solo paquete. Sin embargo, algunas bibliotecas de JavaScript exportan varios paquetes desde un módulo. Este caso también es compatible con Kotlin, aunque debe declarar un nuevo .kt archivo para cada paquete que importe.

Por ejemplo, hagamos nuestro ejemplo un poco más complicado:

module.exports =
    mylib:
        pkg1:foo:function()/* some code here */,bar:function()/* some code here */,
        pkg2:baz:function()/* some code here */

Para importar este módulo en Kotlin, debe escribir dos archivos fuente de Kotlin:

@file:JsModule("extModule")@file:JsQualifier("mylib.pkg1")package extlib.pkg1

externalfunfoo()externalfunbar()

y

@file:JsModule("extModule")@file:JsQualifier("mylib.pkg2")package extlib.pkg2

externalfunbaz()

@JsNonModule anotación

Cuando una declaración se marca como @JsModule, no puede usarlo desde el código de Kotlin si no lo compila en un módulo de JavaScript. Por lo general, los desarrolladores distribuyen sus bibliotecas como módulos JavaScript y descargables. .js archivos que puede copiar a su proyecto static recursos e incluir a través de un