KO + TypeScript + Cordova でハイブリッドアプリ開発

いつもお世話になっております。KnockoutJS の無限の可能性を具現化していきたい私です。

私はアプリ開発に関する知識がほぼゼロなのですが、Knockout による SPA の開発技術を活かせるならと Cordova の勉強を始めました。そんな折にちょうどよく勉強会が開かれるということで。

[第1回Apache Cordova勉強会(動画)](https://www.youtube.com/watch?v=Fn_6Soc2U10)
[第2回Apache Cordova勉強会(まとめ)](http://matome.naver.jp/odai/2141753726187635201)

にお邪魔させていただきました。

既に [第3回](http://7b543bd41af4571f0bdafff1b5.doorkeeper.jp/events/18225) の開催も予定されています。（いつも開催時に次の予定を決めておき告知するというのはいいですね！）
できれば第3回にて、KnockoutJS をコアとした Cordova アプリの開発で登壇できたら、ということで主催の田中さんと少しお話させていただいたりしました。

この記事は KnockoutJS AdventCalendar 2014 最終日の記事でもありますが、第3回Cordova勉強会に向けての第一歩となります。

## 今回作成したサンプルプロジェクト

[kots-cordova-example(Github)](https://github.com/sukobuto/kots-cordova-example)

### 内容

めちゃくちゃ単純なメモアプリです。
クリスマスに相応しくない面白味のなさですが、かなり忙しかったのでゴメンナサイ！

![スクリーンショット 2014-12-25 02.40.03.png](https://qiita-image-store.s3.amazonaws.com/0/25145/643b514a-67e7-9f9c-f8cf-032980e203a9.png)

`cordova run browser` でのみ検証してますが、プラットフォーム依存なことは一切してないので iOS でも Android でも動くはずです。

### 構成

以下のようになっています。

- 主要言語: TypeScript
- SPAフレームワーク: 独自構築
- コアライブラリ: KnockoutJS (v3.2), jQuery
- ルーティングライブラリ: [routie](http://projects.jga.me/routie/)
- UI フレームワーク: [Ratchet](http://goratchet.com/)
- AMDモジュールおよびタスクランナーとしての [WebPack](http://webpack.github.io/)

ほぼほぼ [前々回のSPAプロジェクトサンプル](http://qiita.com/sukobuto/items/392d35c1a7170c143278) から移植しているため、使っていないライブラリも多少残っています。

### 開発時間

SPA から大部分をそのまま移植できたので3時間半で完成しました。

### ルーティングとUIフレームワークの干渉

今回使った routie というルーティングライブラリは、Knockout チュートリアルでもおなじみの Sammy.js 同様にハッシュリンク `#hoge` で画面遷移するものです。

これについて一つ問題がありまして、UI フレームワークの Ratchet は [モーダル(ダイアログ)](http://goratchet.com/components/#modals) やポップオーバーなどの動きのある機能をすべてこのハッシュリンクをトリガとするように設計されています。
つまり**プログラムから直接ダイアログを出す仕組みが無い**ようです。

routie によるルーティングを行っているため、このハッシュリンクをトリガとする機能がすべて動かなくなってしまっています。

#### 別の方法に切り替えるも...

そこで仕方なく [page.js](http://visionmedia.github.io/page.js/) という pushState を使った画面遷移のルーティングライブラリに切り替えてみました。

[page.js を使ったブランチ](https://github.com/sukobuto/kots-cordova-example/tree/feature-routing-with-pagejs)

ですが、今度は cordova run browser による動作確認に影響が出てしまいました。
ブラウザプラットフォームでの動作はローカルファイルへのアクセスで行われるため、どうしても pushState が動かないのです。(ここはどうにか Node.js でサーバにしてほしいところですが...)

ですがこれはもちろんアプリにすれば正しく動作することは確認済みです。

#### 問題は UI フレームワークの乏しさ

OnsenUI や ionic のすごさを目の当たりにして、Angular からひとたび離れるとかなり何もない、**ものすごい田舎に来てしまった**かのような気分になります。

ここらへんはいかに Knockout が好きなユーザとして貢献していけるかが重要かなと思うところですが、もうすでに大差があるというのは事実でしょう。

## Cordova と Angular と Knockout と私

現状、Cordova といえば Angular というような構図が出来上がっていると私は思っています。
UI フレームワークの [ionic](http://ionicframework.com/) や [Onsen UI](http://ja.onsen.io/) などは Angular をコアとする開発環境を前提としています。

Angular は SPA フレームワークとしての完成度が重視されているようで、Cordova のような SPA にフォーカスすべき環境には向いているし、関連技術もある程度安定した足場で開発できるということが理由であろうと思っています。

私がなぜ Knockout での Cordova アプリ開発の道を模索しているかというと、この Angular 一択になりかけている状況で、別の選択肢が欲しいからです。**Angularが嫌いだとかそういうことでは全くありません**。

要するに**Cordova+Angularはもう誰でもできるくらい道が踏み固められているし、どうせやるなら好きな Knockout でやってみよう**という話です。

ちなみに私が Knockout を好きな理由は、Knockout がフレームワークではなく例えば**レゴブロックのブロック同士をつなげる突起**と呼べるくらい解決範囲がミニマムであるということです。完成されたフレームワークを使うのではなく、自らフレームワークを構築できるということは、**手が届かない場所が存在しない**といえます。

開発者にハックする自由と楽しさを与えてくれる部品として Knockout をお勧めしたいと思っています。

## これから

今のところ `#cordovajp` は勉強会がメインの活動のようですので、何としても毎回参加して Angular 一択の現状に風穴を開けていきたいなと思っています。
もうちょっとアプリ開発の練習も進めて行きます。

あと次の勉強会では、お仕事で Knockout を使って**どんなSPAをつくってるのか**もちらっと紹介できると思います。