36
第4回関東 Firefox OS 勉強会発表資料(2013/10/16) Knockout を用いた Firefox OS アプリケーションの開発 iizukak(いいづかけー)

Knockout を用いた Firefox OS アプリケーションの開発

Embed Size (px)

DESCRIPTION

関東Firefox OS勉強会 4th 発表スライド JavaScript MVVM フレームワーク Knockout を用いた Firefox OS アプリケーションの開発について話しました。

Citation preview

Page 1: Knockout を用いた Firefox OS アプリケーションの開発

第4回関東 Firefox OS 勉強会発表資料(2013/10/16)

Knockout を用いた Firefox OS アプリケーションの開発iizukak(いいづかけー)

Page 2: Knockout を用いた Firefox OS アプリケーションの開発

自己紹介

✤ iizukak(いいづかけー)

✤ Github, Qiita, Twitter

✤ ソフトウェアエンジニア @ 六本木

✤ JS をたくさん書くお仕事

✤ プログラミングとボルダリングが好き

Page 3: Knockout を用いた Firefox OS アプリケーションの開発

今日お話しすること

✤ MV* フレームワークあれこれ

✤ Knockout の紹介

✤ Knockout を用いた Firefox OS アプリの開発

前半は Firefox OS とあまり関係ないですが、お付き合いください

Page 4: Knockout を用いた Firefox OS アプリケーションの開発

MV* フレームワークあれこれ

Page 5: Knockout を用いた Firefox OS アプリケーションの開発

MV* フレームワークあれこれ

✤ JS の MV* フレームワークとされるライブラリは数多い

✤ そもそも、MV* フレームワークはなぜ必要?

Page 6: Knockout を用いた Firefox OS アプリケーションの開発

MV* フレームワークあれこれ

✤ Firefox OS アプリ含め、最近の JS 開発では、モデルの状態を、動的にビューに反映することは必須

ユーザー

JS

①アイコンタップ

③モデルの 状態が変化

②イベント通知

④ビューに反映

Page 7: Knockout を用いた Firefox OS アプリケーションの開発

MV* フレームワークあれこれ

✤ モデルのデータをビューと結びつける =「データバインド」

✤ データバインドを自力で書くのは割と面倒

✤ 動的にビューをいじる仕組み作りが面倒

✤ コードの総量も増えがち

Page 8: Knockout を用いた Firefox OS アプリケーションの開発

MV* フレームワークあれこれ

✤ MV* フレームワークの多くが、データバインド機能を提供

✤ Angular : デフォルトである

✤ Knockout : デフォルトである

✤ Backbone : Epoxy.js とか使ってやる

✤ MV* フレームワークは、データバインド機能を中心に、コードを構造化する手助けをするライブラリ(※個人的見解です)

Page 9: Knockout を用いた Firefox OS アプリケーションの開発

MV* フレームワークあれこれ

✤ デザインパターンの話がないぞ!というお客様へ

✤ MV* の定義は人や本によってまちまち

✤ 各々のフレームワークが提案する使い方に従ってコードを書けば、デザパタについてはそんなに悩まなくても良い(※個人的見解です)

Backbone MVC : Model-View-Controller Knockout MVVM : Model-View-ViewModelAngular MVW : Model-View-Whatever

Page 10: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

Page 11: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 特徴

✤ Model-View-ViewModel デザインパターン

✤ 宣言的データバインド

✤ 動的なビュー書き換えの実装サポート

✤ 拡張製が高い

✤ 抽象的なので、実際の利用例で説明します

Page 12: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 宣言的データバインドの例:名前を表示するアプリ

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

function AppViewModel() { this.firstName = "山田"; this.lastName = "太郎";}ko.applyBindings(new AppViewModel());

出力

HTML

JavaScript

Page 13: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ いじくりたいタグに data-bind 属性を記述

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

function AppViewModel() { this.firstName = "山田"; this.lastName = "太郎";}ko.applyBindings(new AppViewModel());

出力

HTML

JavaScript

strong タグをいじりたい

Page 14: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ データバインドの種類を書く

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

function AppViewModel() { this.firstName = "山田"; this.lastName = "太郎";}ko.applyBindings(new AppViewModel());

出力

HTML

JavaScript

テキストを挿入: text

Page 15: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 適用したい変数名を適当に決める

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

function AppViewModel() { this.firstName = "山田"; this.lastName = "太郎";}ko.applyBindings(new AppViewModel());

出力

HTML

JavaScript

firstName, lastName にする

Page 16: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ ビューに適用する変数を持つコンストラクタを宣言

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

function AppViewModel() { this.firstName = "山田"; this.lastName = "太郎";}ko.applyBindings(new AppViewModel());

出力

HTML

JavaScript

コンストラクタに firstName, lastName 変数を用意

Page 17: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ ko.applybinding メソッドを呼んだタイミングで有効化

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

function AppViewModel() { this.firstName = "山田"; this.lastName = "太郎";}ko.applyBindings(new AppViewModel());

出力

HTML

JavaScript バインドを起動

Page 18: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ データバインドは、一般的にこんなかんじで記述

<開始タグ data-bind="データバインドの種類: 適用する変数名"></終了タグ>

function コンストラクタ() {

this.適用する変数 = 値;}ko.applyBindings(new コンストラクタ());

HTML

JavaScript

Page 19: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 宣言的データバインドの良さ

✤ HTML を見ればどこの要素がいじられるのか明瞭

✤ デザイナーさんと分業しやすい

✤ 「ここは JS で制御する部分だからいじくらんでおこう…」

✤ data-* 属性は正当な HTML 属性のため、実装した HTML が validな HTML になり、気分がよい

Page 20: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 組み込みデータバインドをいくつか紹介

click binding クリックイベントをハンドリング

css binding CSS を適用

visible binding 表示・非表示切り替え

if binding if 文による分岐

Page 21: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 動的なビュー操作の実装サポート

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p>

function AppViewModel() { this.firstName = ko.observable(); this.lastName = ko.observable();}

出力

HTML

JavaScript

Page 22: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ ユーザの名前入力に従って、表示内容を変更したい

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p>

function AppViewModel() { this.firstName = ko.observable(); this.lastName = ko.observable();}

出力

HTML

JavaScript

Page 23: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ コンストラクタに、ko.observable という変数を宣言

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p>

function AppViewModel() { this.firstName = ko.observable(); this.lastName = ko.observable();}

出力

HTML

JavaScriptobservable な変数を宣言

Page 24: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ ユーザが苗字と名前を入力

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p>

function AppViewModel() { this.firstName = ko.observable(); this.lastName = ko.observable();}

出力

HTML

JavaScript

ユーザが値を入力

Page 25: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ 書き換わったことが JS 側に通知され、変数が書き換わる

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p>

function AppViewModel() { this.firstName = ko.observable(); this.lastName = ko.observable();}

出力

HTML

JavaScript

変数の値が書き換わる

Page 26: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ ビューが動的に書き換わる

<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p>

<p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p>

function AppViewModel() { this.firstName = ko.observable(); this.lastName = ko.observable();}

出力

HTML

JavaScript

ビューを動的に書き換えてくれる

Page 27: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ その他の特徴

✤ MIT ライセンス

✤ 組み込みバインディングで物足りなくなったら、自作できる

✤ 割と高速 (Android 2.x 世代の端末でもそれなりに動く)

✤ テストが書きやすい

✤ Knockout 本体も Jasmine を使ってテストされている

Page 28: Knockout を用いた Firefox OS アプリケーションの開発

Knockout の紹介

✤ お仕事での実例

✤ iPhone, Android 向けネイティブゲームアプリ

✤ UI はほぼ全て WebView で実装

✤ 規模:HTML 200 画面、JS 数万行

✤ モデルの変更・ビューの書き換えが非常に多い

✤ Knockout を活用。自作 binding も数十個

Page 29: Knockout を用いた Firefox OS アプリケーションの開発

Knockout を用いたFirefox OS アプリの開発

Page 30: Knockout を用いた Firefox OS アプリケーションの開発

Firefox OS アプリへの組み込み

✤ 試作アプリ

✤ 簡易 Twitter クライアント

✤ OAuth 認証

✤ タイムライン表示

✤ Github へのリンク

Page 31: Knockout を用いた Firefox OS アプリケーションの開発

Firefox OS アプリへの組み込み

✤ UI は Firefox OS Building Blocks ライブラリ

Page 32: Knockout を用いた Firefox OS アプリケーションの開発

Firefox OS アプリへの組み込み

✤ アプリケーションの全体像

UI ロジック VIew の状態を管理 ビジネスロジック

ViewModel Model TwitterAPI

FxOS クライアント APIサーバ

データバインド・TL情報・ファボ情報・タップイベント発火

メソッド呼び出し・TL 取得メソッド・ツイートメソッド

API通信

View

Page 33: Knockout を用いた Firefox OS アプリケーションの開発

Firefox OS アプリへの組み込み

✤ Knockout 使っている場所

✤ タイムラインをリスト表示するとこ

✤ foreach-binding

✤ ko.observableArray

✤ text-binding

✤ attr-binding

Page 34: Knockout を用いた Firefox OS アプリケーションの開発

Firefox OS アプリへの組み込み

✤ 感想

✤ 非常に素直に導入できた

✤ 「あ、これ Knockout を使って簡単に書けるやつだ」が多い

✤ タイムラインへの新規ツイートの挿入が容易に実装できた

✤ MVVM がアプリの要件にマッチ

✤ MVVM はそもそもが GUI アプリ向けのデザインパターン

Page 35: Knockout を用いた Firefox OS アプリケーションの開発

まとめ

Page 36: Knockout を用いた Firefox OS アプリケーションの開発

まとめ

✤ MV* フレームワーク

✤ データバインドを中心に、プログラムの構造化を手助け

✤ Knockout

✤ 宣言的データバインド

✤ 動的なビュー書き換えの実装サポート

✤ Firefox OS アプリケーションの開発にも適してそう