在Kotlin中使用Javascript库

Fra*_*ero 8 kotlin

我上次使用Kotlin的时间是2015年12月,当时我用它来解决几个Project Euler问题.

这次我想尝试与Javascript的互操作性.现在我的问题是,我们如何在Kotlin中导入/使用现有的Javascript库?我见过一些人使用native关键字,我只是想简单解释一下.

Ale*_*eev 7

没有native关键字,有@native注释.目前,它是工作解决方案,你可以使用它与Kotlin编译器的1.0.x分支.但是,我们将弃用此注释以支持extern注释,因此请准备最终为1.1.x分支重写代码.

@native注释放在类或顶级函数上时,会发生两件事:

  1. 它的主体没有编译成JavaScript.
  2. 编译器直接引用此类或函数,没有包名称和修改.

我认为通过提供JavaScript库的示例更容易解释:

function A(x) {
    this.x = x;
    this.y = 0;
}
A.prototype.foo = function(z) {
    return this.x + this.y + z;
}

function min(a, b) {
    return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

以及相应的Kotlin声明

@native class A(val x: Int) {
    var y: Int = noImpl

    fun foo(z: Int): Int = noImpl
}

@native fun min(a: Int, b: Int): Int = noImpl
Run Code Online (Sandbox Code Playgroud)

注意,这noImpl是一个特殊的占位符,由于非抽象函数需要主体和非抽象属性需要初始化器.顺便说一句,当我们更换@nativeextern,我们将摆脱这一点noImpl.

与JS库互操作的另一个方面是通过模块系统包含库.对不起,我们现在没有任何解决方案(但很快就会发布).见提案.您可以对node.js/CommonJS使用以下解决方法:

@native interface ExternalModule {
    fun foo(x: Int)
}

@native fun require(name: String): dynamic = noImpl

fun main(args: Array<String>) {
   val module: ExternalModule = require("externalModule")
   module.foo(123)
}
Run Code Online (Sandbox Code Playgroud)

其中外部模块的声明方式如下

function foo(x) {
    return x + 1;
}
module.exports = { foo : foo };
Run Code Online (Sandbox Code Playgroud)