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 のプロジェクトである必要もないですね。めでたしめでたし。