Created
March 25, 2020 16:48
-
-
Save okunokentaro/9c21a62c998205f8f522d133f041e79f to your computer and use it in GitHub Desktop.
Scala.js始めるのでチュートリアルのメモ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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