前回のScala.jsをnodeプロジェクトで扱うの続きです。
前回はsbtベースでScala.jsを実行していましたが、今回はスタンドアローン版を使ってnodeプロジェクトで扱います。
モチベーション
- sbtベースの場合だと出力先のパスが固定なのが微妙(指定する方法があれば教えてください)
- というかsbtがツラいからあまり関わりたくない
という感じにちょっとネガティブな感じのモチベーションで進めています。
スタンドアローン版のScala.jsのインストール
bin-wrapperでScala.jsをラップしたものを作ったので、このscalajs-standalone-binとscala-binをインストールします。
$ npm install --save scala-bin scalajs-standalone-bin
brew
などでscala
などをインストールしていればscala-bin
をインストールする必要はありませんが、npm
でScala
のバージョンを含めて管理すると考えるとscala-bin
をインストールしておくとCI環境などにそのまま出せるので楽で良いです。(ただしプロジェクト毎にScalaをダウンロードするので容量は持ってかれます)
.scalaのコンパイル
コンパイルするためにpackage.json
のscripts
にスタンドアローン版でのコンパイルコマンドを記述します。
"scripts": {
"compile": "scalajsc src/main/scala/hoge.scala -d hoge && scalajsld -o hoge.js hoge"
}
注意点としてscalajsc
で中間ファイルを生成するときに指定するディレクトリは事前に生成しておく必要があります。compile
にmkdir -p hoge
のようにディレクトリ作成コマンドを仕込めば良いのですが、いまいちイケてないので何か良いオプションが欲しいです。
$ npm run compile
コマンドを実行すると成果物としてhoge.js
が出来ていると思います。あとはこれをbabelの乗せるなり、browserifyに乗せるなり、gulpに乗せるなり好きにしてください。(Scala.js v0.6.3からES6モードがサポートされているので、この手のツールに乗せるという選択肢はありになってきたかなという印象です)
おわりに
前回の挫折した話を解消するのにこの構成が欲しくなったので作った閑話休題的な話でした。
とはいえ、この構成を取れるようになったので、sbtベースのnodeプロジェクト、スタンドアローンベースのnodeプロジェクトという選択肢を取れるようになりました。JS <=> Scalaのように世界がまたぐ構成を作るのはまだ無理ですが、ScalaJSのみで完結するところでなら、このどちらかの構成で戦うキッカケになれるかなと思います。
挫折した話を解消する方法は大分見えてきたので、それ用のツールを作ったらまた続きの話でも書きます。