Scala.js

  • Scala to JSコンパイラ
  • 今までの類似コンパイラと違いフルセットのScalaをJSにコンパイルできるのが特徴

最近のScala.jsの動向

  • Google Closureコンパイラで最小化しても16MBだったのが、必要なものしかコンパイルされなくなり小さくなった
    • 何も使わない場合は数KB
    • Listだけ使った場合で596KB(ちなみにJQuery 2.0.3は82KB)
  • コンパイラプラグイン化により使いやすくなった
    • 普通のclassファイルも生成するようになりIDEなどから使えるように
    • sbtのインクリメンタル・コンパイルもできるように

Scala.jsからScalaのライブラリを使う

lazy val scalazCore = ProjectRef(base = file("scalaz/source"), id = "core")

lazy val scalaz = project settings(
  (Defaults.defaultSettings ++ ScalaJSPlugin.scalaJSSettings):_*
) settings(
  unmanagedSourceDirectories in Compile <+= baseDirectory(_ / "source" / "core")
) dependsOn scalazCore
  • scalazを使う場合の例
  • ソースをcloneしてbuild.sbtにちょっと書くだけで使える
  • 動くかどうかは別問題

Scala.jsからJSのライブラリを使う

  • Scala.jsの作者がscala-js-ts-importerというものを公開しているが現状ほとんど使えない
  • 静的に型を付ける方法と動的に使う方法がある

Scala.jsからJSのライブラリを使う(静的)

trait JQuery extends js.Object {
  def apply(selector: js.String): JQuery
  def append(content: js.String): Unit
}

object JsGlobals extends js.GlobalScope {
  def jQuery: JQuery = _
}

object Main {
  def main(): Unit = {
    JsGlobals.jQuery("#playground").append("<p>Hello World!</p>")
  }
}

Scala.jsからJSのライブラリを使う(動的)

object Main {
  def main(): Unit = {
    js.Dynamic.global.jQuery("#playground").append("<p>Hello World!</p>")
  }
}

現状のScala.jsの問題

  • 実行時エラーが多い(コンパイル時と実行時で参照できるクラスなどが違う)
  • 使えるJavaのクラスが少ない
  • それに他のライブラリに依存しないことを考えると使える既存ライブラリは少ない(Scalazとか)
  • Scala.js用に自分でライブラリを作る必要がある

<Thank You!>

Important contact information goes here.