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>

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