Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Scala.jsはじめました?
@k_kinzal
k-kinzal/scala-bin
k-kinzal/sbt-bin
k-kinzal/scala-standalone-bin
アジェンダ
1. Scala.jsでできること
2. Scala.js + SBTでできること
3. Scala.js Standaloneでできること
4. まとめ
1. Scala.jsでできること
ScalaをJavaScriptにコンパイルできる
target/scala-2.11/project-name-fastopt.js
(function() {
// 超長い
})();
@JSExportで指定したクラスとメソッド
はglobalに設定される
target/scala-2.11/project-name-fastopt.js
(function() {
// 超長いコード
})();
var list = global.MyList().apply([1, 2, 3, 4])
※ob...
src/main/scala/MyList.scala
@JSExport trait MyList {
@JSExport def apply = …
}
※当たり前だけどtraitはエクスポートできない
型によっては出力したメソッドに渡せない
渡せる
- String => String
- Number(整数) => Integer
- Number => Double
- Boolean => Boolean
- null => ALL TYPE
渡せない
- Array => Seq
- Object => Map
- Function => (A) => B
※JSからは呼び出せない独自型で型チェックを行われる
JS側から呼び出す必要がある場合は
scala.scalajs.jsで定義された型を
インターフェースに設定する必要がある
※この仕様大嫌い
渡せる
- Array => scala.scalajs.js.Array
- Object => scala.scalajs.js.Object
- Function => scala.scalajs.js.Function0…
何でも渡せるAnyや
nullを許容するArrayOptとかもある
テストは専用の
テストフレームワークを使う必要がある
※使ったことはない
メジャーなScalaTestとかは使えない
※Scala.jsへの依存を外したプロジェクトを作って
マルチプロジェクト構成にすれば使えはする
必読
- http://www.scala-js.org/
- http://www.scala-js.org/api/scalajs-library/0.6.4
- http://www.scala-js.org/news/2015/07/0...
2. Scala.js + SBTでできること
SBTプロジェクトを作れる
.
├── project
│ ├── build.properties
│ ├── plugins.sbt
├── src
│ ├── main/scala/org/example
│ └── test/scala/org/example
├...
project/plugins.sbt
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.4")
build.sbt
enablePlugins(ScalaJSPlugin)
name := ...
$ sbt fastOptJS
SBTから実行もできる
src/main/scala/org/example/Hello.scala
package org.example
import scala.scalajs.js.JSApp
object Hello extends JSApp {
def ...
$ sbt run
[info] Compiling 1 Scala source to (...)/scala-js-
tutorial/target/scala-2.11/classes...
[info] Running org.exam...
persistLauncherオプションで
def mainを実行するJSを出力できる
target/scala-2.11/projectname—launcher.js
((typeof global === "object" && global &&
global["Object"] === Object) ? global ...
jsDependenciesでJSの依存を
解決できる
target/scala-2.11/project-name-jsdeps.js
(function( window, undefined ) {
// JQueryのコード
})( window );
build.sbt
jsDependen...
webjars.orgでnpmの
登録とかもできるので
必要なライブラリがあれば随時登録
※やったことはない
target/scala-2.11/project-name-jsdeps.js
build.sbt
jsDependencies += ProvidedJS / "myJSLibrary.js"
src/main/resources/myJS...
実はES6での出力もできる
target/scala-2.11/project-name-fastopt.js
(function() {
// 超長いES6のコード
})();
build.sbt
scalaJSOutputMode :=
OutputMode.ECMA...
こういう機能があれば・・・は
だいたいある
3. Scala.js Standaloneでできること
SBTを使わないでビルドできる
スタンドアローン版も配布されている
出力ディレクトリを自由に指定できる
scalajsc src/main/scala/Hello.scala -d .tmp/ && scalajsld --output
hello.js .tmp/
依存解決がないせいか結構早い
npmベースのプロジェクトに
組み込みやすい
package.json
“scripts”: {
“compile”: “scalajsc src/main/scala/org/example/Hello.scala -d
.tmp/ && scalajsld --output hello...
ただし、できないことがある
できない
- Scalaライブラリの依存解決(jarを持って来ればできる)
- JSライブラリの依存解決(npmでやることになる)
- IDEのサポート
デメリット踏まえたら
npmに組み込めるので融通が利きやすい
開発サイクルやリリースフローで
困ったらこっち
まとめ
欲しい機能は最低限揃ってる
紹介していないオプションも
結構あるのでAPIドキュメントと
リリースノートは必読
Scala.js独自の作法を抑えておけば
地雷を踏みぬくもとも少なくなるはず
おしまい
Scala.jsはじめました?
Upcoming SlideShare
Loading in …5
×

Scala.jsはじめました?

1,475 views

Published on

#

Published in: Technology
  • Be the first to comment

Scala.jsはじめました?

  1. 1. Scala.jsはじめました? @k_kinzal
  2. 2. k-kinzal/scala-bin k-kinzal/sbt-bin k-kinzal/scala-standalone-bin
  3. 3. アジェンダ 1. Scala.jsでできること 2. Scala.js + SBTでできること 3. Scala.js Standaloneでできること 4. まとめ
  4. 4. 1. Scala.jsでできること
  5. 5. ScalaをJavaScriptにコンパイルできる
  6. 6. target/scala-2.11/project-name-fastopt.js (function() { // 超長い })();
  7. 7. @JSExportで指定したクラスとメソッド はglobalに設定される
  8. 8. target/scala-2.11/project-name-fastopt.js (function() { // 超長いコード })(); var list = global.MyList().apply([1, 2, 3, 4]) ※objectは一度コールする必要がある src/main/scala/MyList.scala @JSExport object MyList { @JSExport def apply = … }
  9. 9. src/main/scala/MyList.scala @JSExport trait MyList { @JSExport def apply = … } ※当たり前だけどtraitはエクスポートできない
  10. 10. 型によっては出力したメソッドに渡せない
  11. 11. 渡せる - String => String - Number(整数) => Integer - Number => Double - Boolean => Boolean - null => ALL TYPE
  12. 12. 渡せない - Array => Seq - Object => Map - Function => (A) => B ※JSからは呼び出せない独自型で型チェックを行われる
  13. 13. JS側から呼び出す必要がある場合は scala.scalajs.jsで定義された型を インターフェースに設定する必要がある ※この仕様大嫌い
  14. 14. 渡せる - Array => scala.scalajs.js.Array - Object => scala.scalajs.js.Object - Function => scala.scalajs.js.Function0…
  15. 15. 何でも渡せるAnyや nullを許容するArrayOptとかもある
  16. 16. テストは専用の テストフレームワークを使う必要がある
  17. 17. ※使ったことはない
  18. 18. メジャーなScalaTestとかは使えない ※Scala.jsへの依存を外したプロジェクトを作って マルチプロジェクト構成にすれば使えはする
  19. 19. 必読 - http://www.scala-js.org/ - http://www.scala-js.org/api/scalajs-library/0.6.4 - http://www.scala-js.org/news/2015/07/03/announcing-scalajs- 0.6.4/ - https://github.com/scala-js/scala-js
  20. 20. 2. Scala.js + SBTでできること
  21. 21. SBTプロジェクトを作れる
  22. 22. . ├── project │ ├── build.properties │ ├── plugins.sbt ├── src │ ├── main/scala/org/example │ └── test/scala/org/example ├── target └── build.sbt ※sjrd/activator-hello-scala-jsとかあるけどまだ公開されてない
  23. 23. project/plugins.sbt addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.4") build.sbt enablePlugins(ScalaJSPlugin) name := “scalajs-example“ scalaVersion := "2.11.5"
  24. 24. $ sbt fastOptJS
  25. 25. SBTから実行もできる
  26. 26. src/main/scala/org/example/Hello.scala package org.example import scala.scalajs.js.JSApp object Hello extends JSApp { def main = println("Hello") }
  27. 27. $ sbt run [info] Compiling 1 Scala source to (...)/scala-js- tutorial/target/scala-2.11/classes... [info] Running org.example.Hello Hello
  28. 28. persistLauncherオプションで def mainを実行するJSを出力できる
  29. 29. target/scala-2.11/projectname—launcher.js ((typeof global === "object" && global && global["Object"] === Object) ? global : this)["Hello"]().main(); build.sbt persistLauncher := true
  30. 30. jsDependenciesでJSの依存を 解決できる
  31. 31. target/scala-2.11/project-name-jsdeps.js (function( window, undefined ) { // JQueryのコード })( window ); build.sbt jsDependencies += "org.webjars" % "jquery" % "1.10.2"
  32. 32. webjars.orgでnpmの 登録とかもできるので 必要なライブラリがあれば随時登録 ※やったことはない
  33. 33. target/scala-2.11/project-name-jsdeps.js build.sbt jsDependencies += ProvidedJS / "myJSLibrary.js" src/main/resources/myJSLibrary.js console.log(111); console.log(111);
  34. 34. 実はES6での出力もできる
  35. 35. target/scala-2.11/project-name-fastopt.js (function() { // 超長いES6のコード })(); build.sbt scalaJSOutputMode := OutputMode.ECMAScript6
  36. 36. こういう機能があれば・・・は だいたいある
  37. 37. 3. Scala.js Standaloneでできること
  38. 38. SBTを使わないでビルドできる スタンドアローン版も配布されている
  39. 39. 出力ディレクトリを自由に指定できる
  40. 40. scalajsc src/main/scala/Hello.scala -d .tmp/ && scalajsld --output hello.js .tmp/
  41. 41. 依存解決がないせいか結構早い
  42. 42. npmベースのプロジェクトに 組み込みやすい
  43. 43. package.json “scripts”: { “compile”: “scalajsc src/main/scala/org/example/Hello.scala -d .tmp/ && scalajsld --output hello.js .tmp/” } ※npm用にk-kinzal/scalajs-standalone-bin公開してる
  44. 44. ただし、できないことがある
  45. 45. できない - Scalaライブラリの依存解決(jarを持って来ればできる) - JSライブラリの依存解決(npmでやることになる) - IDEのサポート
  46. 46. デメリット踏まえたら npmに組み込めるので融通が利きやすい
  47. 47. 開発サイクルやリリースフローで 困ったらこっち
  48. 48. まとめ
  49. 49. 欲しい機能は最低限揃ってる
  50. 50. 紹介していないオプションも 結構あるのでAPIドキュメントと リリースノートは必読
  51. 51. Scala.js独自の作法を抑えておけば 地雷を踏みぬくもとも少なくなるはず
  52. 52. おしまい

×