Scala.js が sbt プロジェクト以外でも使えるようになっていた

Scala.js 0.5.0 では standalone 版が配布されるようになりました。

http://www.scala-js.org/news/2014/06/13/announcing-scalajs-0.5.0/

これで sbt プロジェクトでなくても Scala.js が使えるようになりました。 以下の URL で配布されています。

http://www.scala-js.org/downloads.html

このパッケージには 3 つコマンドが含まれています。

  • scalajsc
  • scalajsld
  • scalajsp

scalajsc は Scala.js のコンパイラです。 scalac のラッパーになっていて、scalac を起動するときに Scala.js の jar もクラスパスに加えてくれるだけの単純なもの。

試して見ましょう。次のような Hello.scala を用意します。

package hello

import scala.scalajs.js
import js.Dynamic.{ global => g }

import js.annotation.JSExport

@JSExport
object Hello {

  @JSExport
  def hello(): Unit = {
    g.alert("Hello")
  }

}
$ scalajsc Hello.scala

すると、hello というディレクトリが生成されました。この中にクラスファイルが含まれています。

$ tree hello
hello
├── Hello$.class
├── Hello$.sjsir
└── Hello.class

0 directories, 3 files

sjsir ってなんだよって感じですね。これは Scala.js が生成する中間ファイルで、気にしないで良いですが、気になる人は scalajsp コマンドでのぞけるっぽいですよ。

$ scalajsp hello/Hello\$.sjsir
module class Lhello_Hello$ extends O ancestors O {
  hello__V(): <notype> {
    <global>["alert"]("Hello".cast[dyn])
  }
  $$js$exported$meth$hello__O(): any {
    this.hello__V();
    undefined
  }
  "hello"(): any {
    this.$$js$exported$meth$hello__O()
  }
  export "Hello"
  hello__(): any {
    this.hello__V();
    undefined
  }
}
;

生成されたクラスファイルをリンクして js を生成するには scalajsld コマンドを使います。 scalajsld コマンドには引数としてクラスパス(つまりhelloディレクトリ)を渡し、 出力先の js ファイルを -o オプションとして渡します。

$ scalajsld -o hello.js hello
Fast optimizing hello.js
Inc. opt stats: reused: 0 -- invalidated: 2726 -- trees read: 219

scalajsld のヘルプを見ればわかりますが、optimize の仕方は fastOpt(-f), noOpt(-n), fullOpt(-u) から選ぶことができます。デフォルトは fastOpt です。

これで、hello.js というファイルが生成されてめでたく使えるようになりました。

<html>
  <head>
    <script type="text/javascript" src="hello.js"></script>
    <script type="text/javascript">
      Hello().hello();
    </script>
  </head>
</html>

f:id:tototoshi:20140622004359p:plain

ちゃんと動いた。

sbt のプロジェクトどころか Scala のプロジェクトである必要もないですね。めでたしめでたし。