SPAに必要なJavaScriptFrameWork

50
S P A Single-Page-Application における JavaScriptFrameWork のお話

description

html5jエンタープライズ部 第7回ナイトセミナーのスライド(1/27)

Transcript of SPAに必要なJavaScriptFrameWork

Page 1: SPAに必要なJavaScriptFrameWork

S P A(Single-Page-Application)

           における

JavaScriptFrameWork          のお話

Page 2: SPAに必要なJavaScriptFrameWork

自己紹介

酒巻 瑞穂

■業務系のSE屋さん

■活動とか  ◆ HTML5j エンタープライズ部(スタッフ)

  ◆ HTML5j Webプラットフォーム部(スタッフ)

  ◆ FireFoxOS コードリーティング (わるだくらみ補佐)

Twitter:https://twitter.com/SakamakiM

Facebook:https://twitter.com/SakamakiM

Page 3: SPAに必要なJavaScriptFrameWork

Single Page Application

Page 4: SPAに必要なJavaScriptFrameWork

単一のHTMLファイル?

Page 5: SPAに必要なJavaScriptFrameWork

一度の描画で全部取る?

Page 6: SPAに必要なJavaScriptFrameWork

「Page」とは何なのか?

Page 7: SPAに必要なJavaScriptFrameWork

SPA描画の流れ

Page 8: SPAに必要なJavaScriptFrameWork

画面

SPA描画の流れ

Page 9: SPAに必要なJavaScriptFrameWork

画面

コンテンツ

SPA描画の流れ

Page 10: SPAに必要なJavaScriptFrameWork

画面

コンテンツ

断片化したHTMLファイル

SPA描画の流れ

Page 11: SPAに必要なJavaScriptFrameWork

SPA描画の流れ

画面

コンテンツ

断片化したHTMLファイル

Pageほぼ決まっている基礎フレーム部分

(プレースホルダー)

View使用するユーザーや状況により変わる!

Page 12: SPAに必要なJavaScriptFrameWork

PageとViewを分ける意味

Page

View

Page 13: SPAに必要なJavaScriptFrameWork

再利用性とパフォーマンス

Page

ナビゲーション

常に表示メニュー

RSS ページ

設定ページ

あまり使わない

Page 14: SPAに必要なJavaScriptFrameWork

状況/目的による切り分け

Page

ナビゲーション

Offlineでも使う

メニュー

RSS ページ

設定ページ

Network必須

Page 15: SPAに必要なJavaScriptFrameWork

SPAにおけるServerの役割

Page 16: SPAに必要なJavaScriptFrameWork

SPAにおけるServerの役割

UIの処理を持たない

Page 17: SPAに必要なJavaScriptFrameWork

SPAにおけるServerの役割

UIの処理を持たない

状態を持たない

Page 18: SPAに必要なJavaScriptFrameWork

SPAにおけるServerの役割

UIの処理を持たない

状態を持たない

リソースの提供

Page 19: SPAに必要なJavaScriptFrameWork

SPAにおけるClientの役割

UIの処理を持たない

状態を持たない

リソースの提供

ルーティング処理クライアント側でページ遷移を求められる。(ページの切り替えはクライアントで!)

Page 20: SPAに必要なJavaScriptFrameWork

UIの処理を持たない

状態を持たない

リソースの提供

ルーティング処理クライアント側でページ遷移を求められる。(ページの切り替えはクライアントで!)

ビジネスロジックと状態クライアント側でビジネスロジックとデータ、状態の管理を行う。

SPAにおけるClientの役割

Page 21: SPAに必要なJavaScriptFrameWork

UIの処理を持たない

状態を持たない

リソースの提供

ルーティング処理クライアント側でページ遷移を求められる。(ページの切り替えはクライアントで!)

ビジネスロジックと状態クライアント側でビジネスロジックとデータ、状態の管理を行う。

データの取得Ajax、またはWebSocket等のリソース取得手段が必要

SPAにおけるClientの役割

Page 22: SPAに必要なJavaScriptFrameWork

コンテンツ

描画(UI)

BLS

リソースアクセスルーティング

状態管理

UIとBLSの同期

Page 23: SPAに必要なJavaScriptFrameWork

コンテンツを組み合わせると同じような処理が多数発生!!

状態管理

BLS 通信

BLS

Route

BLS

状態管理

処理状態管理

通信

Route

通信

Page 24: SPAに必要なJavaScriptFrameWork
Page 25: SPAに必要なJavaScriptFrameWork

ExtExtJSJS

Page 26: SPAに必要なJavaScriptFrameWork

ExtExtJSJS

軽い説明

ダウンロード:http://angularjs.org/APIドキュメント:http://docs.angularjs.org/api/ライブラリ:http://ngmodules.org ライセンス:MIT

ダウンロード、APIドキュメント、ライブラリ:http://backbonejs.org/ライセンス:MIT

ダウンロード:https://www.sencha.com/products/extjs/downloadAPIドキュメント:http://docs.sencha.com/extjsライブラリ:https://market.sencha.com/ライセンス:GPLv3

Page 27: SPAに必要なJavaScriptFrameWork

今回のお題! (MVP or MVC) DOM

(UI)

View

PresenterOr

Controller

Model

ServerAccessAjax

WebSocket

Template

router

Data-binding

Page 28: SPAに必要なJavaScriptFrameWork

今回のお題! (MVP or MVC)

Domへのアプローチ

DOM(UI)

View

PresenterOr

Controller

Model

ServerAccessAjax

WebSocket

Template

router

Data-binding

Page 29: SPAに必要なJavaScriptFrameWork

今回のお題! (MVP or MVC)

Domへのアプローチ

ルーティング状態管理

DOM(UI)

View

PresenterOr

Controller

Model

ServerAccessAjax

WebSocket

Template

router

Data-binding

Page 30: SPAに必要なJavaScriptFrameWork

今回のお題! (MVP or MVC)

Domへのアプローチ

ルーティング状態管理

ビジネスロジック

DOM(UI)

View

PresenterOr

Controller

Model

ServerAccessAjax

WebSocket

Template

router

Data-binding

Page 31: SPAに必要なJavaScriptFrameWork

今回のお題! (MVP or MVC)

Domへのアプローチ

ルーティング状態管理

ビジネスロジック

モデルとビューの同期

DOM(UI)

View

PresenterOr

Controller

Model

ServerAccessAjax

WebSocket

Template

router

Data-binding

Page 32: SPAに必要なJavaScriptFrameWork

今回のお題! (MVP or MVC)

Domへのアプローチ

ルーティング状態管理

ビジネスロジック

モデルとビューの同期

外部リソースへのアクセス

DOM(UI)

View

PresenterOr

Controller

Model

ServerAccessAjax

WebSocket

Template

router

Data-binding

Page 33: SPAに必要なJavaScriptFrameWork

DOM(UI)

View(compileDOM)

Model(POJO)

Template(カスタムHTML)

Controller(directive)

Domへのアプローチ

★カスタムHTMLテンプレートAngularでは一度テンプレートと呼ばれるベースHTMLを読み込み、コンパイルすることで、JavaScriptに密接に紐付くDOMツリーし、画面描画します。

★独自タグでイベントを定義するメリット

controllerで定義されたビューイベントは命令的です。viewと完全に切り離されているため、再利用性とテストコードからのアプローチが容易です

対して directiveで定義されたイベントは宣言的でありHTML自体が宣言的な言語であるため、自然な流れでHTMLへの独自拡張、欠点を補うことができます。

Presenter(Controller)DataBinding

ngRouter

ServerAccess(Angular.$http)

(Factory)

Page 34: SPAに必要なJavaScriptFrameWork

ルーティング

AngularJSチームが作成しているngRouteを使うことでルーティング処理が可能になります。

より高機能なAngularUI Routerと言うサードパーティ製ライブラリもあります。

状態管理

cookieについては、AngularJSチームが作成した、cookie制御用のライブラリAngular-cookieがあります。

localstrageの制御については、AngularLocalstrageというサードパーティ製ライブラリがあります。

DOM(UI)

View(compileDOM)

Model(POJO)

Template(カスタムHTML)

Controller(directive)

Presenter(Controller)DataBinding

ngRouter

ServerAccess(Angular.$http)

(Factory)

Page 35: SPAに必要なJavaScriptFrameWork

ビジネスロジック

AngularのビジネスロジックはServiceを用いてビジネスロジックを実装します。Serviceには色々ありますが、それぞれ用途に応じて使い分けます。格納されるのはJavaScriptObjectです。

factoryシンプルなBusinessLogicの実装、Service登録するまでもない軽量なBLSの定義ができる。

serviceサービスの登録ができる、モジュールを横断した使用が可能

provider初期化時の振る舞いなど、細やかな制御ができるサービスを登録することができます。

vlaueModuleを横断してつかえるJavaScriptObjectを定義できます

constantModuleを横断してつかえる値の定義ですが、valueと違い、上書きできません。

DOM(UI)

View(compileDOM)

Model(POJO)

Template(カスタムHTML)

Controller(directive)

Presenter(Controller)DataBinding

ngRouter

ServerAccess(Angular.$http)

(Factory)

Page 36: SPAに必要なJavaScriptFrameWork

モデルとビューの同期

Angularには双方向バインディング機能があります。そのため、開発者は、ほぼ自然にViewとロジックの同期を取ることができます。

しかしながら、この双方向バインディングはパフォーマンスなどの問題が発生する可能性があります。

DOM(UI)

View(compileDOM)

Model(POJO)

Template(カスタムHTML)

Controller(directive)

Presenter(Controller)DataBinding

ngRouter

ServerAccess(Angular.$http)

(Factory)

Page 37: SPAに必要なJavaScriptFrameWork

外部リソースへのアクセス

Ajaxでの遣り取りは、単純なものであれば、$Httpを使います。

Ajax通信部分を、モジュール内で再利用可能なコンポーネントとして定義したい場合、ngResourceを使いプロバイダとして定義できます。

WebSocketを使用する場合は、Factory等で再利用可能な形で定義して使用する事が一般的です。

DOM(UI)

View(compileDOM)

Model(POJO)

Template(カスタムHTML)

Controller(directive)

Presenter(Controller)DataBinding

ngRouter

ServerAccess(Angular.$http)

(Factory)

Page 38: SPAに必要なJavaScriptFrameWork

Domへのアプローチ

DOMの構築はBackbone.VIewを用いて定義します。Bacbone.View内のrenderでDOM要素の構築を行うことができます。

しかしながら、より簡単にするために、追加のライブラリを用いてテンプレートエンジンを使うことが一般的です。

テンプレートエンジンは様々なものが用意されており、目的に応じてある程度選択できます。

DOM(UI)

View(Backbone.View)

Presenter(JS Object)

Model(Backbone.Model)

ServerAccess(Backbone.sync)

Template(html、ejs)

Backbone.StickIt

Backbone.Router

Page 39: SPAに必要なJavaScriptFrameWork

ルーティング

Backbone.Routerを使うことで基本的なルーティング処理は実現できます。

しかし、Backbone.Routerには状態管理やネストしたルーティング管理を持たないため、状態管理を行いたい場合はサードパーティ製ライブラリを用いる必要があります。

状態管理

状態の制御、cookieとLocalstrageの管理です。制御には、サードパーティ製ライブラリを用います。Jqueryライブラリのjquery.cookieとBackboneLocalstrageが有名です。

DOM(UI)

View(Backbone.View)

Presenter(JS Object)

Model(Backbone.Model)

ServerAccess(Backbone.sync)

Template(html、ejs)

Backbone.StickIt

Backbone.Router

Page 40: SPAに必要なJavaScriptFrameWork

ビジネスロジック

BackboneはビジネスロジックはModelとCollectionを用いて定義します。

・Backbone.ModeデータのCRUDと保持を担当

・Backbone.CollectionModelの集合体

簡単なアプリケーションであればプレーンなBackboneでも問題ないですが、規模のおおきな開発では定形コードの削減やコード全般の汚染を防ぐためBackbone.Marionetteを使うのをお勧めします。

DOM(UI)

View(Backbone.View)

Presenter(JS Object)

Model(Backbone.Model)

ServerAccess(Backbone.sync)

Template(html、ejs)

Backbone.StickIt

Backbone.Router

Page 41: SPAに必要なJavaScriptFrameWork

モデルとビューの同期

Backboneは単体ではデータバインディング機能を持っていません。

もし、データバインディングが必要となる場合は、サードパーティ製ライブラリ(Backbone.StickIt等)を使うことで実現できるようになります。

しかし、明示的に定義していかなければならないため、AngularJSよりはコードが煩雑になります。

DOM(UI)

View(Backbone.View)

Presenter(JS Object)

Model(Backbone.Model)

ServerAccess(Backbone.sync)

Template(html、ejs)

Backbone.StickIt

Backbone.Router

Page 42: SPAに必要なJavaScriptFrameWork

外部リソースへのアクセス

Ajax通信を行う場合は、Backbone.syncにAjax通信の機能があるのでそれを使用します。

WebSocket通信を行う場合はBackbone.syncをオーバーライドして使います。

syncの仕様http://backbonejs.org/#Sync

DOM(UI)

View(Backbone.View)

Presenter(JS Object)

Model(Backbone.Model)

ServerAccess(Backbone.sync)

Template(html、ejs)

Backbone.StickIt

Page 43: SPAに必要なJavaScriptFrameWork

Domへのアプローチ

DOMの構築はExt.Componentを継承した様々なレイアウト用クラスが使用できます。

一部例)Ext.button.Button(ボタン)Ext.grid.Panel(Grid)Ext.form.Label(ラベル)

Ext.TemplateDOMを容易に生成する為のクラスです。文字列、またはJSON形式で定義します。

Ext.XTemplateはExt.Templateを継承したクラスとなっており、比較演算子や条件分岐、Ext.view.Viewを中継してExxt.XTemplateとExt.data.Storeとの紐付けも可能です。

DOM(UI)

View(Ext.Component)

Controller(Ext.app.Controller)

Model(Ext.data.Model)

ServerAccess(Ext.data.Ajax)

(Ext.ux.WebSocket)

Template(Ext.Template)

ExtExtJSJS

Page 44: SPAに必要なJavaScriptFrameWork

ルーティング

ExtJSはMVCフレームワークのため、MVP特有のルーティング機能は提供されていません。

Routerを使用したい場合、ユーザーエクステンションのExt.ux.Routerと言う軽量ライブラリが存在します。

状態管理

Cookies、Localstorageを用いて状態管理を行う場合、ExtJSではExt.state.Providerクラスを継承した以下の機能を使います。

Ext.state.CookieProviderクッキー用の状態保持クラス

Ext.state.LocalStorageProviderLocalstrage用の状態保持クラス

ExtExtJSJSDOM(UI)

View(Ext.Component)

Controller(Ext.app.Controller)

Model(Ext.data.Model)

ServerAccess(Ext.data.Ajax)

(Ext.ux.WebSocket)

Template(Ext.Template)

DOM(UI)

View(Ext.Component)

Controller(Ext.app.Controller)

Model(Ext.data.Model)

ServerAccess(Ext.data.Ajax)

(Ext.ux.WebSocket)

Template(Ext.Template)

Page 45: SPAに必要なJavaScriptFrameWork

ビジネスロジック(モデルとビューの同期)

ExtJSのビジネスロジックはExt.data.Modelと、Ext.data.Storeで成り立ちます。

Ext.data.Modelデータの保持とCRUDを担当する。

Ext.data.StoreModelの集合体

Ext.Componentを継承したViewに当たる機能は、内部にStoreManagerを所持しており、StoreオプションにModel(Store)を設定するとこでViewとModelの紐付きを行えます。

ExtExtJSJSDOM(UI)

View(Ext.Component)

Controller(Ext.app.Controller)

Model(Ext.data.Model)

ServerAccess(Ext.data.Ajax)

(Ext.ux.WebSocket)

Template(Ext.Template)

Page 46: SPAに必要なJavaScriptFrameWork

外部リソースへのアクセス

ExtJSにはAjax通信用のクラスが用意されています。

Ext.Ajaxを用いた柔軟な通信の他に、Ext.data.Readerを用いてModelを生成するExt.data.AjaxProxyや、Rest通信用のExt.data.RestProxyなど、目的に応じた様々なクラスが用意されています。

WebSocket通信に関しては、ユーザーエクステンションでExt.ux.WebSocketがあります。

ExtExtJSJSDOM(UI)

View(Ext.Component)

Controller(Ext.app.Controller)

Model(Ext.data.Model)

ServerAccess(Ext.data.Ajax)

(Ext.ux.WebSocket)

Template(Ext.Template)

Page 47: SPAに必要なJavaScriptFrameWork

日本語書籍

➔ AngularJS✔ はじめてのAngularJS

➔ Backbone✔ Backbone.jsガイドブック✔ Backbone.jsアプリケーション開発ガイド@ 2/7

➔ Sencha ExtJS ✔ ExtJS 4 実践開発ガイド✔ ExtJS 4 実践開発ガイド2

Page 48: SPAに必要なJavaScriptFrameWork

日本語のAPI(Web)

➔ AngularJS✔ 日本語のAPI✔ http://js.studio-kingdom.com/angularjs

➔ Bakcbone✔ 日本語のAPI✔ http://backbonejs.apidocs.jp/

➔ ExtJS✔ xenophyで翻訳されたものがあり✔ http://docs.xenophy.com/ext-js/4-0/

Page 49: SPAに必要なJavaScriptFrameWork

AngularJSルール:フレームワーク寄り  学習コスト:高い  MV~:MVP

破壊的なUI/Viewの変更にも対応しやすい。

デザイン等が決まってなく、素早くプロトタイプしながら形を作り出していく場合に有用全体的に依存性注入などにより、ロジック全体がフレームワークのルールに依存する形になるので、わりと統制が取れた仕組みになりやすい。

Backbone ルール:プロジェクト内で作る  学習コスト:低い  MV~:MVP & MVC

MVP、MVC両方の手段が取れる

JSフレームワークなども選択肢が多いため案件に合わせた最適なカスタマイズができるのが良い既にフロント開発に携わっている場合、そのノウハウを引き継げる為、導入の敷居はさらに低くできる。

ExtJSルール:フレームワーク重視 学習コスト:高い(xenophyによるトレーニングあり) MV~:MVC

MVCパターン重視の為、破壊的なUI/VIew変更がある場合は向かないが、ビジネスロジックが重要になる場合は堅牢なものが作れるため、とても相性が良い。

学習コストは高め、導入の敷居は高いが、xenophyによるコンサルティングからトレーニングまで有償でうけられる為、要員が確保できない場合は良い。サポート付き、かつフレームワークのルールが強いので長期の保守、運用を考えると向いている。

Page 50: SPAに必要なJavaScriptFrameWork

ご清聴ありがとうございました。