概要
(自分メモ)
NodejsやBrowser向けのKotlin Multiplatformプロジェクトのテンプレを作成
Kotlin/jsやKotlin MPP でJavasctiptのモジュールを使用する際のメモ
ソース
実行
nodejs
gradlew jsNodeRun
標準出力にHello World!
が表示される。
browser
gradlew jsBrowserRun
開いたBrowserのConsoleにHello World!
が出力されている。
関数をexportするnpmモジュールを取り込む
例: is-sortedモジュール
JavaScriptモジュール側の定義スタイル
//...
module.exports = function checksort (array, comparator) {
//...
build.gradle.kts
//..
kotlin {
js {
nodejs {}
binaries.executable()
}
sourceSets {
val jsMain by getting {
dependencies {implementation(npm("is-sorted", "1.0.5"))}
}
}
}
Main.kt
@JsModule("is-sorted")
@JsNonModule
external fun <T> sorted(a: Array<T>): Boolean
fun main() {
println("Is sorted: ${sorted(arrayOf(1, 2, 3))}")
println("Is sorted: ${sorted(arrayOf(1, 3, 2))}")
}
比較
サンプル: net-snmp for javascript
Javascriptでの記述
import { Session } from "net-snmp";
Kotlin/js
@file:JsModule("net-snmp")
@file:JsNonModule // CommonJS の場合
external fun Session():dynamic
Javascriptでexportされたクラス
Javascriptでの定義
var Session = function (target, authenticator, options) {/*..*/}
Session.create = function (target, community, options) {/* クラスメソッド */}
Session.prototype.getNext = function (oids, responseCb) {/* オブジェクトメソッド */}
exports.Session=Session;
Javascriptでの使用
import { Session } from "net-snmp";
const session=Session.create("192.168.11.5","public")
Kotlin/jsでの外部型宣言
@file:JsModule("net-snmp") // import {...} from "net-snmp" の場合
@file:JsNonModule // CommonJS Moduleの場合
external class Session {
companion object {
fun create(target: String, community: String, options: SessionOptions? = definedExternally): Session
}
fun getNext(oids:Array<String>,responseCb:(error:Error?, varbinds:Array<Varbind>)->Unit )
}