Nuestro equipo especializado pasados algunos días de trabajo y recopilar de información, han obtenido la solución, deseamos que te sea de utilidad en tu trabajo.
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
ynodejs
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 ymodule.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 etiqueta. Para decirle a Kotlin que está bien usar un
@JsModule
declaración de un entorno que no sea de módulo, agregue la @JsNonModule
anotación. Por ejemplo, considere el siguiente código JavaScript:
functiontopLevelSayHello(name)alert("Hello, "+ name);if(module && module.exports) module.exports = topLevelSayHello;
Podrías describirlo desde Kotlin de la siguiente manera:
@JsModule("hello")@JsNonModule@JsName("topLevelSayHello")externalfunsayHello(name: String)
Sistema de módulos utilizado por la biblioteca estándar de Kotlin
Kotlin se distribuye con la biblioteca estándar Kotlin / JS como un solo archivo, que a su vez se compila como un módulo UMD, por lo que puede usarlo con cualquier sistema de módulos descrito anteriormente. Si bien para la mayoría de los casos de uso de Kotlin / JS, se recomienda utilizar una dependencia de Gradle en kotlin-stdlib-js
, también está disponible en NPM como kotlin
paquete.