投稿の内容
本投稿では、JavaScript
側で定義されているグローバルオブジェクトをScala.js
で使えるようにする方法をご紹介します。
JS
側のオブジェクト
JS
側で以下のグローバルオブジェクトが定義されていたとします。
const Hoge = {
name: 'Hoge',
saySomething: (message) => console.log(message),
};
これを例えばHTML
ファイル内でロードすると、このHTML
内のJS
からHoge
オブジェクトが使えるようになります。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hoge</title>
</head>
<body>
<script type="text/javascript" src="hoge.js"></script>
</body>
</html>
このHoge
オブジェクトをFFIしてScala.js
側のコードから使えるようにします。
Scala.js
側の定義
JS
側のグローバルオブジェクトは、Scala.js
ではobject
として定義できます。ただし、@js.native
と@JSGlobal
の2つのアノテーションが必要です。
object
の名前もJS
側のオブジェクトと同じ名前にし、js.Object`を継承する必要があります。
そして、オブジェクトのメンバも同じ名前で定義します。それぞのメンバの挙動は、JS
側で実装してあるので、Scala.js
では実装する必要なく、その代わりにjs.native
を使います。
import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobal
@js.native
@JSGlobal
object Hoge extends js.Object {
val name: String = js.native
def saySomething(message: String): Unit = js.native
}
これでScala.js
側からHoge.name
やHoge.saySomething("Hello")
などのように呼び出すことができるようになりました。