ChatWork Creator's Note

ビジネスチャット「チャットワーク」のエンジニアとデザイナーのブログです。

ScalaJS in 2017

こんにちは。@kyo_agoです。

2015年ごろに盛り上がっていたScalaJSですが、最近あまり話を聞かないのでまとめてみようと思います。

ver 1.0.0でた?

まだ出てないです。
(1.0.0-M2がライブラリ実装者向けのテスト版として公開されてる状況)

ただ、ScalaJS側としてはver 0.6.0(2015/02/05)時点で「実用段階(production-ready)」という声明を出しており、ver 1.0.0で予定されているユーザ向けの変更も0.6.xに対しては非推奨の警告を出しているものの削除等で大きなものは予定されていません。

Scala.jsはもはや試験的段階を脱した!との由 - M12i.

そもそもScalaJSのver 1.0.0は「Scalaからjsへ変換する中間ファイル形式の安定」を目標に切られており、ScalaJSとしての言語仕様はver 0.6.0から大きく変更されていません。

npmとの連携はどう?

build.sbt内にpackage.jsonの定義を書いたり、sbtとwebpackを連携させるためのscalajs-bundlerが公開されています。
(ちょっと試してはみたんですが、個人的には設定ファイルが複雑になりすぎる懸念があったので採用はしませんでした)

TypeScriptとの連携は?

scala-js-ts-importerという.d.tsから.scala(ScalaJSの型定義)に変換するCLIプログラムが公開されているので、コマンドラインで変換後にScalaJS側から型定義を使用することができます。

ただ、TypeScript側の仕様のうち、変換できるもののみを変換するためサポートされていない機能も多いです。

どの程度のものが変換できるかはブラウザ上で試すこともできるので、一度確認しておくことをおすすめします。

また、すでに明日(2017/12/03)になってしまいましたが、scala-js-ts-importerハッカソン - connpassも企画されているため、興味のある方は是非参加してみてください。

Scala内でJava API触ってると使えないんだよね?

ScalaJSは実行環境がJSなため、ScalaからJavaにアクセスしているコードは実行できないという弱点がありました。

しかし、最近はScalaJS側でJavaをJS実行環境上で実行できるように移植したため、一部のJava APIはそのままコンパイルして実行できるようになっています。

ファイルサイズはどう?

ScalaJSと言えば当初(ver 0.2)「Hello Worldが22MBある」として話題になっていましたが、現状(ver 0.6.21)ではHello Worldが未圧縮で90KB、最適化後で12KBになっています。

実際の環境(Scala側のライブラリは未使用、WebRTCでのビデオ会議システム)では未圧縮で650KB、最適化後で146KBになっています。
(ここからgzipして38KB程度)

採用事例は?

国内で公開されている情報だと以下のような物があります。

最近だと「実は社内では採用している」という話もよく聞くので、すでに検証から実証の状態へ移っている印象です。