Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save okunokentaro/9c21a62c998205f8f522d133f041e79f to your computer and use it in GitHub Desktop.
Save okunokentaro/9c21a62c998205f8f522d133f041e79f to your computer and use it in GitHub Desktop.
Scala.js始めるのでチュートリアルのメモ
2015/07/04 にQiitaに投稿した記事のアーカイブです
---
どうも@armorik83です。
周りを見渡すと、ちょうどElixirやってる人やRust始めちゃってる人が居たので、自分もなんかやるかーと思って、Scalaに手を出そうかな。せっかくScala.jsなんていう最高にロックなAltJS(?)があるので、まずはそこを足掛かりにしていく。
ちなみに日本だけだろうが、`Scala.js`で[ググる](https://www.google.co.jp/search?q=Scala.js)と公式を押しのけてトップに現れるブログがある。イカでいう「もうここも塗られてた」状態である。さすがだ。
# Scala.js チュートリアル
> http://www.scala-js.org/doc/tutorial.html
今回はこのチュートリアルに従っていく。以下の内容は執筆時点のものなので、基本的には上記チュートリアルの最新のコード・コマンドを参照されたい。
## sbtインストール
> http://www.scala-sbt.org/download.html
```
brew install sbt
```
brewがあるならそれで。ちなみにsbtは"Scala-oriented build tool"の[略だそうです](http://www.methodsandtools.com/tools/scalabuildtool.php)。
## 新規プロジェクト用のディレクトリを作成
`scalajs-tutorial`内で作業する。
```
mkdir ~/Desktop/scalajs-tutorial && cd $_
```
## プラグインの使用宣言
`./project/plugins.sbt`を作成する。
```
mkdir project
echo 'addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.6")' > project/plugins.sbt
```
## build.sbt
`build.sbt`を作成する。
```
touch build.sbt
```
```build.sbt
enablePlugins(ScalaJSPlugin)
name := "Scala.js Tutorial"
scalaVersion := "2.11.7" // or any other Scala version >= 2.10.2
```
※ 後述するが、ここはその時々のScalaのバージョンと一致しないとエラーが出る。
`./project/build.properties`が必要らしいので作る。
```
echo 'sbt.version=0.13.9' > project/build.properties
```
# TutorialApp.scalaを作成
いよいよScalaファイルを作成する。随分と深いところに作らされるが、おとなしく従う。なお、この時点でScalaの文法等詳細は全然学んでいない。コピペです。
```
mkdir -p src/main/scala/tutorial/webapp/; touch src/main/scala/tutorial/webapp/TutorialApp.scala
```
```scala:TutorialApp.scala
package tutorial.webapp
import scala.scalajs.js.JSApp
object TutorialApp extends JSApp {
def main(): Unit = {
println("Hello world!")
}
}
```
# sbt run
## JDKが必要
起動すると早速怒られた。(JDKが入っている方は読み飛ばしてOK)
```
sbt
No java installations was detected.
Please go to http://www.java.com/getjava/ and download
```
('・c_・` )ソッカー
ここで表示される`http://www.java.com/getjava/`は罠なので、ここに行ってもしょうがない、JDKが必要。
> http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
ここから"Mac OS X x64"を選択しダウンロード。インストールは`JDK 8 Update 45.pkg`に任せる。終わったら確認。
```
/usr/libexec/java_home -V
Matching Java Virtual Machines (1):
1.8.0_45, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
```
## sbt起動
気を取り直して、もう一度。
```
sbt
Getting org.scala-sbt sbt 0.13.7 ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt/0.13.7/jars/sbt.jar ...
[SUCCESSFUL ] org.scala-sbt#sbt;0.13.7!sbt.jar (3829ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/main/0.13.7/jars/main.jar ...
[SUCCESSFUL ] org.scala-sbt#main;0.13.7!main.jar (6380ms)
```
行けたみたいだ。ここから色々落としていてかなり時間がかかるので、根気強く待つ:coffee:
```
[info] Done updating.
[info] Set current project to Scala.js Tutorial (in build file:/Users/armorik83/Desktop/scalajs-tutorial/)
>
```
終わったらこんな感じにプロンプトが立ち上がるので、`run`する。
```text:sbt
run
```
mavenが動いているらしく、またかなり待つ。
## エラーの対処
案の定こういうのは一発でいかない。
```text:sbt
[warn] Scala version was updated by one of library dependencies:
[warn] * org.scala-lang:scala-library:2.11.5 -> 2.11.7
[warn] To force scalaVersion, add the following:
[warn] ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }
[warn] Run 'evicted' to see detailed eviction warnings
[warn] No main class detected
[trace] Stack trace suppressed: run last compile:scalaJSLauncher for the full output.
[error] (compile:scalaJSLauncher) No main class detected.
[error] Total time: 0 s, completed Jul 4, 2015 9:55:23 PM
```
ひとまず`build.sbt`の記述を`scalaVersion := "2.11.7"`に改めて再度実行した。一旦sbt内で`exit`してから再度sbtを起動しないと反映しないので注意。そしてまたえらい待つ。
```text:sbt
> run
[warn] No main class detected
[trace] Stack trace suppressed: run last compile:scalaJSLauncher for the full output.
[error] (compile:scalaJSLauncher) No main class detected.
[error] Total time: 0 s, completed Jul 4, 2015 10:00:30 PM
```
また同じエラーだ。`No main class detected`、そんなバカなと思ったら`TutorialApp.scala`が0 bytesのままで、バカなのは自分だった:joy_cat: リアルタイムに作業しながらこの記事を書いているので、もうこのまま進める。
## コンパイル成功
正しく実行されると次のように表示される。
```text:sbt
> run
[info] Compiling 1 Scala source to /Users/armorik83/Desktop/scalajs-tutorial/target/scala-2.11/classes...
[info] Running tutorial.webapp.TutorialApp
Hello world!
[success] Total time: 1 s, completed Jul 4, 2015 10:01:17 PM
```
なんとか行けた。
## Run with Node.js (fastOptJS)
Scala.jsでは"Run with Node.js"というrunの手法があるようで、これは公式のチュートリアルで**推奨**されている。
```text:sbt
$ sbt fastOptJS
[info] Loading project definition from /Users/armorik83/Desktop/scalajs-tutorial/project
[info] Set current project to Scala.js Tutorial (in build file:/Users/armorik83/Desktop/scalajs-tutorial/)
[info] Fast optimizing /Users/armorik83/Desktop/scalajs-tutorial/target/scala-2.11/scala-js-tutorial-fastopt.js
[success] Total time: 1 s, completed Jan 30, 2016 2:09:11 PM
```
おー、たしかに速い。で、この時コンパイルされた`.js`はどこかというと`./target/scala-2.11/scala-js-tutorial-fastopt.js`だ。
## fullOptJS
```
sbt fullOptJS
```
というコマンドで、いちいちsbtを起動させずにいきなりshで打つこともできる。コンパイルは上記のScalaソースで2秒。かつては分単位で掛かっていたそうなので、十分現実的な速さだろう。(それでも増えてくると遅いとの噂)
あとこの出力されたJSソースは、Lintの効いたAtomで開いたら最新のMacでさえ1分ほど固まったので、Lint有効のまま開かない方がいい。
# JSFiddleで確認してみて
最後に実際に動く例を貼っておく。使ったScalaソースは以下。
```scala:HelloWorld.scala
package example
import scala.scalajs.js
object HelloWorld extends js.JSApp {
def main(): Unit = {
println("Hello world!")
}
}
```
> https://jsfiddle.net/qucn4ka4/
一番下に小さく書かれた`example.HelloWorld().main();`が呼び出し側だ。まあ、なんというか、すごいな。
# おわりに
なるほど、これが~~今ちまたで大流行中の~~AltJSか!
まだHello world!しかできていませんが、JS界とScala界をつなぐ`js.JSApp`を学べて、ちょうど今作りたいネタもあるので、しばらく遊んでみます。
ちなみに1年半ほど前にAltJS (TypeScript)に手出しした直後は、私は[こんな記事](http://qiita.com/armorik83/items/d93fb9c80c489f0fabcf)をぬかしていました。思えば遠くに来たもんだ。
以上です。
# 参考リンク
- http://www.scala-js.org/
- [Scala.js v0.6試してみた](http://qiita.com/mizchi/items/842cc6e18e8fe110c74c)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment