Movatterモバイル変換
[0]
ホーム
URL:
画像なし
夜間モード
Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
TanUkkii
PDF, PPTX
23,512 views
Isomorphic web development with scala and scala.js
isomorphic tokyo meetupで発表した資料です
Engineering
◦
Read more
11
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 23
2
/ 23
3
/ 23
4
/ 23
5
/ 23
6
/ 23
7
/ 23
8
/ 23
9
/ 23
10
/ 23
11
/ 23
12
/ 23
13
/ 23
14
/ 23
15
/ 23
16
/ 23
17
/ 23
18
/ 23
19
/ 23
20
/ 23
21
/ 23
22
/ 23
23
/ 23
Recommended
PDF
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
by
Kohei Asai
PDF
React.jsでクライアントサイドなWebアプリ入門
by
spring_raining
PDF
One Time Binding & Digest Loop
by
Kon Yuichi
PPTX
React を導入したフロントエンド開発
by
daisuke-a-matsui
PPTX
今からでも遅くない! React事始め
by
ynaruta
PPTX
React.js + Reduxで作るSPA
by
Shohei Saeki
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
by
dcubeio
PDF
サーバサイドエンジニアが 1年間まじめにSPAやってみた
by
Itaru Kitagawa
PDF
Flux react現状確認会
by
VOYAGE GROUP
PDF
ECMAScript6による関数型プログラミング
by
TanUkkii
PDF
Closure Compiler Updates for ES6
by
Teppei Sato
PDF
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
by
Teppei Sato
PDF
アメブロ2016 アメブロフロント刷新にみる ひかりとつらみ
by
Kazunari Hara
PDF
React+TypeScriptもいいぞ
by
Mitsuru Ogawa
PDF
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
by
Yusuke Murata
PPTX
20160927 reactmeetup
by
Naoki Kurosawa
PPTX
2016/12/17 ASP.NET フロントエンドタスク入門
by
miso- soup3
KEY
capybara で快適なテスト生活を
by
Ryunosuke SATO
PDF
Service worker が拓く mobile web の新しいかたち
by
Kinuko Yasuda
PDF
PHP Application E2E with Capybara
by
Yoshiaki Yoshida
PDF
SIROK技術勉強会 #1 「Reactってなんだ?」
by
Naoyuki Kataoka
PDF
RailsでReact.jsを動かしてみた話
by
yoshioka_cb
PDF
angular1脳で見るangular2
by
Moriyuki Arakawa
PDF
Ember コミュニティとわたし
by
Ryunosuke SATO
PDF
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
by
Toshiaki Maki
PDF
Swagger 入門
by
Yoshiaki Yoshida
PDF
なぜ人は必死でjQueryを捨てようとしているのか
by
Yoichi Toyota
PDF
React Canvasで作るFlappy Bird
by
Takuya Tejima
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
by
Masahiro Wakame
PDF
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
by
アシアル株式会社
More Related Content
PDF
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
by
Kohei Asai
PDF
React.jsでクライアントサイドなWebアプリ入門
by
spring_raining
PDF
One Time Binding & Digest Loop
by
Kon Yuichi
PPTX
React を導入したフロントエンド開発
by
daisuke-a-matsui
PPTX
今からでも遅くない! React事始め
by
ynaruta
PPTX
React.js + Reduxで作るSPA
by
Shohei Saeki
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
by
dcubeio
PDF
サーバサイドエンジニアが 1年間まじめにSPAやってみた
by
Itaru Kitagawa
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
by
Kohei Asai
React.jsでクライアントサイドなWebアプリ入門
by
spring_raining
One Time Binding & Digest Loop
by
Kon Yuichi
React を導入したフロントエンド開発
by
daisuke-a-matsui
今からでも遅くない! React事始め
by
ynaruta
React.js + Reduxで作るSPA
by
Shohei Saeki
こんなに使える!今どきのAPIドキュメンテーションツール
by
dcubeio
サーバサイドエンジニアが 1年間まじめにSPAやってみた
by
Itaru Kitagawa
What's hot
PDF
Flux react現状確認会
by
VOYAGE GROUP
PDF
ECMAScript6による関数型プログラミング
by
TanUkkii
PDF
Closure Compiler Updates for ES6
by
Teppei Sato
PDF
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
by
Teppei Sato
PDF
アメブロ2016 アメブロフロント刷新にみる ひかりとつらみ
by
Kazunari Hara
PDF
React+TypeScriptもいいぞ
by
Mitsuru Ogawa
PDF
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
by
Yusuke Murata
PPTX
20160927 reactmeetup
by
Naoki Kurosawa
PPTX
2016/12/17 ASP.NET フロントエンドタスク入門
by
miso- soup3
KEY
capybara で快適なテスト生活を
by
Ryunosuke SATO
PDF
Service worker が拓く mobile web の新しいかたち
by
Kinuko Yasuda
PDF
PHP Application E2E with Capybara
by
Yoshiaki Yoshida
PDF
SIROK技術勉強会 #1 「Reactってなんだ?」
by
Naoyuki Kataoka
PDF
RailsでReact.jsを動かしてみた話
by
yoshioka_cb
PDF
angular1脳で見るangular2
by
Moriyuki Arakawa
PDF
Ember コミュニティとわたし
by
Ryunosuke SATO
PDF
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
by
Toshiaki Maki
PDF
Swagger 入門
by
Yoshiaki Yoshida
PDF
なぜ人は必死でjQueryを捨てようとしているのか
by
Yoichi Toyota
Flux react現状確認会
by
VOYAGE GROUP
ECMAScript6による関数型プログラミング
by
TanUkkii
Closure Compiler Updates for ES6
by
Teppei Sato
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
by
Teppei Sato
アメブロ2016 アメブロフロント刷新にみる ひかりとつらみ
by
Kazunari Hara
React+TypeScriptもいいぞ
by
Mitsuru Ogawa
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
by
Yusuke Murata
20160927 reactmeetup
by
Naoki Kurosawa
2016/12/17 ASP.NET フロントエンドタスク入門
by
miso- soup3
capybara で快適なテスト生活を
by
Ryunosuke SATO
Service worker が拓く mobile web の新しいかたち
by
Kinuko Yasuda
PHP Application E2E with Capybara
by
Yoshiaki Yoshida
SIROK技術勉強会 #1 「Reactってなんだ?」
by
Naoyuki Kataoka
RailsでReact.jsを動かしてみた話
by
yoshioka_cb
angular1脳で見るangular2
by
Moriyuki Arakawa
Ember コミュニティとわたし
by
Ryunosuke SATO
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
by
Toshiaki Maki
Swagger 入門
by
Yoshiaki Yoshida
なぜ人は必死でjQueryを捨てようとしているのか
by
Yoichi Toyota
Viewers also liked
PDF
React Canvasで作るFlappy Bird
by
Takuya Tejima
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
by
Masahiro Wakame
PDF
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
by
アシアル株式会社
PPTX
32 Strategies for Building a Positive Learning Environment
by
Edutopia
PDF
Scala.js
by
ke-m kamekoopa
PPTX
Scala.js: Next generation front end development in Scala
by
Otto Chrons
PPTX
Scala.js for large and complex frontend apps
by
Otto Chrons
PDF
プログラミング言語Scala
by
TanUkkii
PDF
Rendr入門: サーバサイドで(も)動かす、Backbone.js
by
Masahiko Tachizono
PDF
CRDT in 15 minutes
by
Shingo Omura
PDF
Railsのエラーログとの付き合い方
by
Taisuke Kawahara
PDF
minne の API 改善
by
Toshihiro Gotou
PDF
Rails5とAPIモードについての解説
by
Fumiya Sakai
PDF
チームでつくるUIデザイン
by
Sadaaki HIRAI
PDF
Deploy to Lobi
by
Hiroaki Nagata
PDF
WebID and eCommerce
by
Henry Story
PPTX
Akka Clusterの耐障害設計
by
TanUkkii
PDF
ReactとImmutable.jsで関数型を体験してみて思ったこと #scripty06
by
Yahoo!デベロッパーネットワーク
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
by
TanUkkii
PDF
カヤックHTMLファイ部のUI・UX (第57回 HTML5とか勉強会 / 2015.5.19)
by
Shin Fujisawa
React Canvasで作るFlappy Bird
by
Takuya Tejima
ng-japan 2015 TypeScript+AngularJS 1.3
by
Masahiro Wakame
AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ
by
アシアル株式会社
32 Strategies for Building a Positive Learning Environment
by
Edutopia
Scala.js
by
ke-m kamekoopa
Scala.js: Next generation front end development in Scala
by
Otto Chrons
Scala.js for large and complex frontend apps
by
Otto Chrons
プログラミング言語Scala
by
TanUkkii
Rendr入門: サーバサイドで(も)動かす、Backbone.js
by
Masahiko Tachizono
CRDT in 15 minutes
by
Shingo Omura
Railsのエラーログとの付き合い方
by
Taisuke Kawahara
minne の API 改善
by
Toshihiro Gotou
Rails5とAPIモードについての解説
by
Fumiya Sakai
チームでつくるUIデザイン
by
Sadaaki HIRAI
Deploy to Lobi
by
Hiroaki Nagata
WebID and eCommerce
by
Henry Story
Akka Clusterの耐障害設計
by
TanUkkii
ReactとImmutable.jsで関数型を体験してみて思ったこと #scripty06
by
Yahoo!デベロッパーネットワーク
これからのJavaScriptー関数型プログラミングとECMAScript6
by
TanUkkii
カヤックHTMLファイ部のUI・UX (第57回 HTML5とか勉強会 / 2015.5.19)
by
Shin Fujisawa
Similar to Isomorphic web development with scala and scala.js
PDF
Scalaでのプログラム開発
by
Kota Mizushima
PDF
Scalaの現状と課題
by
Kota Mizushima
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
by
Naoya Ito
PPTX
Monacaでつくるハイブリッドアプリ
by
Monaca
PPT
Thrift
by
guestf259ae
PPTX
Fluxflex meetup 2011 in Tokyo
by
Kyosuke Inoue
PDF
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
by
Tomoharu ASAMI
PDF
Scala Warrior and type-safe front-end development with Scala.js
by
takezoe
PDF
Scala EE 7 Essentials
by
tnoda
PDF
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
by
Kazuhiro Sera
KEY
Dev love関西 forslideshare
by
Daisuke Kasuya
PDF
Play framework 2.0のちょっとした紹介
by
Ryo RKTM
PPT
about Thrift
by
Naoya Ito
PDF
Sencha Touch working with AWS
by
久司 中村
PDF
kibayos-PIAX & SkipGraph-071207
by
Mikio Yoshida
PPTX
fluxflex meetup in Tokyo
by
Kyosuke Inoue
PDF
Scala + Finagleの魅力
by
Kota Mizushima
PDF
汎用apiサーバの構築
by
Hidetoshi Mori
ODP
Next Language Scala
by
pengin01
PDF
Yesod(at FPM2012)
by
Seizan Shimazaki
Scalaでのプログラム開発
by
Kota Mizushima
Scalaの現状と課題
by
Kota Mizushima
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
by
Naoya Ito
Monacaでつくるハイブリッドアプリ
by
Monaca
Thrift
by
guestf259ae
Fluxflex meetup 2011 in Tokyo
by
Kyosuke Inoue
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
by
Tomoharu ASAMI
Scala Warrior and type-safe front-end development with Scala.js
by
takezoe
Scala EE 7 Essentials
by
tnoda
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
by
Kazuhiro Sera
Dev love関西 forslideshare
by
Daisuke Kasuya
Play framework 2.0のちょっとした紹介
by
Ryo RKTM
about Thrift
by
Naoya Ito
Sencha Touch working with AWS
by
久司 中村
kibayos-PIAX & SkipGraph-071207
by
Mikio Yoshida
fluxflex meetup in Tokyo
by
Kyosuke Inoue
Scala + Finagleの魅力
by
Kota Mizushima
汎用apiサーバの構築
by
Hidetoshi Mori
Next Language Scala
by
pengin01
Yesod(at FPM2012)
by
Seizan Shimazaki
More from TanUkkii
PDF
Distributed ID generator in ChatWork
by
TanUkkii
PDF
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
by
TanUkkii
PPTX
Architecture of Falcon, a new chat messaging backend system build on Scala
by
TanUkkii
PPTX
JSON CRDT
by
TanUkkii
PDF
WaveNet
by
TanUkkii
PPTX
スケールするシステムにおけるエンティティの扱いと 分散ID生成
by
TanUkkii
PPTX
Akka HTTP
by
TanUkkii
PDF
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
by
TanUkkii
PDF
ディープニューラルネット入門
by
TanUkkii
PDF
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
PDF
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
PDF
Scalaによる型安全なエラーハンドリング
by
TanUkkii
Distributed ID generator in ChatWork
by
TanUkkii
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
by
TanUkkii
Architecture of Falcon, a new chat messaging backend system build on Scala
by
TanUkkii
JSON CRDT
by
TanUkkii
WaveNet
by
TanUkkii
スケールするシステムにおけるエンティティの扱いと 分散ID生成
by
TanUkkii
Akka HTTP
by
TanUkkii
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
by
TanUkkii
ディープニューラルネット入門
by
TanUkkii
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
by
TanUkkii
Scalaによる型安全なエラーハンドリング
by
TanUkkii
Isomorphic web development with scala and scala.js
1.
Isomorphic Webdevelopment with
Scala & Scala.jsTanUkkiiisomorphic tokyo meetup2015/4/30
2.
I am ...•
@TanUkkii007 on Twitter• Web frontend engineer• だったけどゲーム開発が辛くてサーバーサイドをScalaで開発する人に• Scala業務歴4ヶ月
3.
Agenda1. 開発環境を共有する2. コードを共有する3.
アーキテクチャを共有するクライアントーサーバー間で
4.
Motivation• Scala +
Akka + SprayでAPIサーバーを開発• StrongLoopのApi Exprolerみたいなのを作りたい• Scala.jsでisomorphicにつくる!REST/HTTP server build on Akka Actors
5.
Why Scala.js?• クライアントーサーバーで同一の開発環境•
クライアントーサーバーでコードの共有• 片手間クライアント開発
6.
1. Sharing developmentenvironment:
Building applications with sbt• プロジェクト定義• Scalaのバージョン• 依存ライブラリ• コンパイルオプションJava/Scalaのビルドツール設定 タスクname := “your_project_name” scalaVersion := "2.11.6" libraryDependencies ++= Seq( "com.typesafe.akka" %% “akka-actor" % "2.3.10" )!scalacOptions in ThisBuild ++= Seq("-feature")build.sbt• 依存ライブラリの解決• コンパイル• テスト• REPLの起動
7.
Multi-project build- client-
server- rootimport sbt._ import Keys._ object IsomorphicBuild extends Build { lazy val root = project.in(file(“.")) lazy val server = Project(“server", file(“server")) lazy val client = Project("client", file(“client”))!}project/Build.scalasbtではサブプロジェクトを複数定義できる↓サーバーもクライアントもサブプロジェクトとして定義相似のプロジェクト構造ができる→
8.
import sbt._ import Keys._ import
org.scalajs.sbtplugin.ScalaJSPlugin import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ object IsomorphicBuild extends Build { lazy val root = project.in(file(".")).aggregate(server, client) lazy val server = Project(“server", file(“server")) lazy val client = Project("client", file(“client")).enablePlugins(ScalaJSPlugin).settings( persistLauncher in Compile := true, skip in packageJSDependencies := false ) }project/Build.scalaMake Scala.js project!addSbtPlugin(“org.scala-js" % "sbt-scalajs" % "0.6.2")project/plugins.sbtScala.jsプラグインを追加clientプロジェクトでScala.jsプラグインを有効化
9.
Make Scala.js projectisomorphic!import
sbt._ import Keys._ import org.scalajs.sbtplugin.ScalaJSPlugin import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ object IsomorphicBuild extends Build { lazy val root = project.in(file(".")).aggregate(server, client) lazy val server = Project(“server", file(“server")) lazy val client = Project("client", file(“client")).dependsOn(server).enablePlugins(ScalaJSPlugin).settings( unmanagedSourceDirectories in Compile +=(sourceDirectory in server).value/"main"/"scala"/"jp.isomorphic.example" / “shared",packageJSDependencies in Compile := { val base = (packageJSDependencies in Compile).value IO.copyFile(base, (baseDirectory in server).value / "src/main/resources/js" / base.getName) base }, persistLauncher in Compile := true, skip in packageJSDependencies := false ).settings(Seq(fastOptJS, fullOptJS) map { packageJSKey => crossTarget in (Compile, packageJSKey) := (baseDirectory in server).value / "src/main/resources/js" }) }project/Build.scalaサーバーからクライアントにクラスパスを通す(Scalaコンパイルが可能に)コンパイル対象にサーバー側のソースの一部を追加(Scala.jsコンパイルが可能に)Scala.jsのコンパイル結果をサーバー側にコピー
10.
Using CrossProject to
buildisomorphic project structure-shared- js- jvmimport sbt.Keys._ import sbt._import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ !!object ApplicationBuild extends Build { lazy val root = project.in(file(".")) lazy val sharedProject = crossProject.in(file(".")) .settings() .jvmSettings() .jsSettings() ) lazy val js: Project = sharedProject.js.settings() lazy val jvm: Project = sharedProject.jvm.settings() } !ScalaJSPluginのCrossProjectを使えば簡単にisomorphicなプロジェクト構造を作れるscalajs-spa-tutorialを参照scalajs-cross-compile-example,
11.
2. Sharing codes
betweenClient and Server• Scala.jsで利用可能なライブラリ• シリアライゼーションによるScalaデータ型の通信• 型安全なAPIの呼び出し• マクロ
12.
Available Libraries• DOM•
jQuery• React.js• AngularJSwww.scala-js.orgにもっと多く載っているJSライブラリの型付けされたインターフェース• Scalaz• NICTA/rngScalaライブラリのポート• Scala.Rx• Monifu• autowire• uPickle最初からクロスコンパイル前提で作られたライブラリ※Scalaは型だけ提供。実装はJS。※本家のクロスコンパイルできない部分を修正してJSを提供※ScalaとJSを提供
13.
Pickling (serialization)• クラス階層情報の喪失Scala.jsの大問題:可逆的なJSONのシリアライズリフレクションを使わずにコンパイル時に少ないコードで解決しなければならない。サーバー
クライアントJSON{"fruits": [{"color": "yellow"}, {"color": "red"}]}{"points": [{"x": 1, "y": 2}, {"x": 1, "y": 2}]}null [[]]val fruits: List[Fruit] = List(Banana("yellow"), Apple("red"))val p = Point(1,2); val points = List(p, p)val option: Option[Option[Int]] = None通信• 参照同一性の喪失• Optionの扱いScalaデータ型 Scalaデータ型
14.
Cross-compiled pickling librariesきれいなJSON形式クラス階層の保持参照同一性の保持Anyの解決uPickle
○難しいことは忘れてきれいなJSONを吐くことに注力Optionが配列として表現されるPrickle ○ ○可逆性を高めるためメタ情報をJSONに保持させているScala.jsPickling○ ○型の登録処理が事前に必要サポートがあまりよくない
15.
Binary serialization withBooPickle
and XHR2def request(method: String, url: String, body: ArrayBuffer): Future[ByteBuffer] = { val promise = Promise[ByteBuffer] val xhr = new XMLHttpRequest() xhr.onreadystatechange = { (e: Event) => if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300) { val byteBuffer = TypedArrayBuffer.wrap(xhr.response.asInstanceOf[ArrayBuffer]) promise.success(byteBuffer) } else promise.failure(AjaxException(xhr)) }} xhr.open(method, url) xhr.responseType = "arraybuffer" xhr.setRequestHeader("Content-Type", "application/octet-stream") xhr.setRequestHeader("Accept", "application/octet-stream") xhr.send(body) promise.future }val byteBuffer = Pickle.intoBytes(SampleRequest("Hello")) request(method, url, byteBuffer.arrayBuffer()).map(Unpickle[SampleResponse].fromBytes(_))• JSONではなく、バイナリにシリアライズ• XHR level2のバイナリサポートを利用• JSのArrayBufferを使う• メディアタイプは application/octet-stream• クラス階層、参照の同一性も復元可能
16.
Client-server communicationwith Autowireobject
AutowireClient extends autowire.Client[String, Reader, Writer]{ override def doCall(req: Request): Future[String] }trait MyApi { def sampleRequest(id: Int): SampleResponse }object MyApiImpl extends MyApi{ def sampleRequest(id: Int) = SampleResponse(id) }AutowireClient[MyApi].sampleRequest(1).call().map(println)path("api" / Segments){ s => extract(_.request.entity.asString) { e => complete { AutowireServer.route[MyApi](MyApiImpl)( autowire.Core.Request(s, upickle.read[Map[String, String]](e))) }}}object AutowireServer extends autowire.Server[String, Reader, Writer]{ val routes = AutowireServer.route[MyApi](MyApiImpl) }Autowireマクロマジック!!AutowireはAjaxにおけるクライアントーサーバー間のAPIの煩雑さをRPCスタイルのメソッド呼び出しで解決するライブラリ• なぜかRPCは自動で解決される• API呼び出しにおける間違いはコンパイル時に発見される1. sharedでRPCインターフェースを定義2. serverでRPCインターフェースを実装3. serverでルーティング部分関数をマクロにより生成4. serverでルーティング部分関数を呼び出してレスポンスを返す5. clientでAjaxの通信の仕方を実装6. clientでRPC関数を呼び出す
17.
Macroperforming macro expansion
AutowireServer.route[jp.isomorphic.example.MyApi](<empty> match { case autowire.Core.Request(Seq("jp", "isomorphic", "example", "MyApi", "sampleRequest"), (args$macro$1 @_)) => autowire.Internal.doValidate({ <synthetic> <artifact> val x$2 = autowire.Internal.read[String, Int](args$macro$1,scala.util.Left(autowire.Error.Param.Missing("id")), "id", ((x$1) => AutowireServer.read[Int](x$1))); Nil.$colon$colon(x$2) }) match { case scala.$colon$colon((id @ (_: Int @unchecked)), Nil) =>scala.concurrent.Future.successful(MyApiImpl.sampleRequest(id)).map(((x$3) => AutowireServer.write(x$3))) case _ => $qmark$qmark$qmark } }: autowire.Core.Router[String])種明かし:-Ymacro-debug-liteコンパイルオプションでマクロを展開するpackage jp.isomorphic.exampletrait MyApi { def sampleRequest(id: Int): SampleResponse }マクロは←から、関数のシグニチャに対してパターンマッチをかける部分関数を作っていた※Scalaのマクロは抽象構文木を操るすごいやつです
18.
3. Sharing ApplicationArchitectureScalaでフロントエンドのアプリケーションをいざ書くときに今までやってきたことをScalaでどう表現するとよいか迷うオブザーバーパターン
→ ?アーキテクチャをシェアしてコンテクストスイッチのコストを減らそう!
19.
Common Practice:Unidirectional Data
Flow• Tell, don t ask.• Fire and forget.FluxScalajs SPA Tutorialがこの共通点からアプローチしている• unidirectional data flow• message passing複雑さに対抗する手段のコンセプトは同じ
20.
Flux in ScalaつまりStoreがActorになったScalajs
SPA Tutorial* image from
21.
trait Actor { type
Receive = PartialFunction[Any, Unit] def receive: Receive def !(message: Any) = { receive(message) } }trait Dispatcher { var actors = Set.empty[Actor] def dispatch(message: Any) = { actors.foreach { actor => actor ! message } } def register(actor: Actor) = { actors = actors + actor } def unregister(actor: Actor) = { if (actors.contains(actor)) { actors - actor } } }DispatcherはActorプログラミングにおけるRecipient Listパターンvar Dispatcher = {_listeners: [],register: function(callback) {this._listeners.push(callback);return this;},unregister: function(callback) {var index = this._listeners.indexOf(callback);if (index !== -1) {delete this._listeners[index];}return this;},dispatch: function(...args) {this._listeners.forEach(callback =>callback.apply(this, args));return this;}};※Recipient List: メッセージを複数のアクターに拡散し仕事を分散して処理する際に、拡散先の受信者であるアクター参照の一覧を保持しているもの
22.
object SampleDispatcher extends
Dispatcher object SampleActorProtocol { case class Foo(message: String) case class Bar(message: String) } object SampleActor extends Actor { import SampleActorProtocol._ SampleDispatcher.register(this) def receive: Receive = { case Foo(message) => println(message) case Bar(message) => println(message) } }!import SampleActorProtocol._ SampleDispatcher.dispatch(Foo("Hello"))Dispatcher.register(function(payload) {if (payload.type === "FOO") {console.log(payload.message);} else if (payload.type === "BAR") {console.log(payload.message);}});!Dispatcher.dispatch({type: "FOO", message: "Hello"});!!!!!!!!!!!• Dispatcherに関数ではなくActorオブジェクトを登録する• payloadを処理する関数はActorのReceive部分関数に相当• payloadはメッセージ
23.
Conclusion• Scala +
Scala.jsでクライアントーサーバーを高度に統合できる• (ただし他のシステムとのinteropが犠牲になるかも• みんなScala.jsを使おう!!!
Download
[8]
ページ先頭
©2009-2025
Movatter.jp