クライアントサイドMVCについて喋った

月曜日のclient-side templating 勉強会 http://atnd.org/events/28189 で喋った内容をうろ覚えに書き出す。

クライアントMVCが求められるようになった背景

AJAXの流行
PushStateの流行の兆し
メディア系のゲームで使えるAPIの充実

今まではページ遷移の度にJSのオブジェクトを破棄していた。
=> シングルページでリッチなコンテンツが作れるようになり、JSのやることが増えた

PushStateとは

遷移なしにURLを書き換える技術。HTML5 History API
Twitter, Github, Facebook

URLを書き換えるだけなのでコンテンツ(DOM)の操作はアプリ製作者に一任されている。
大規模なHTML書き換えに、クライアントサイドテンプレーティングが重要になってきた。

PushStateのライブラリ

defunkt/pjax
visionmedia/pages
sammy.js
Backbone.Router


自分で実装したことあるけど、ブラウザ互換の吸収が面倒すぎるのでライブラリを使ったほうがいい、という結論。

テンプレートエンジン

mustache
hogan.js
coffeekup (CoffeeScript使っているならば)

Nodeで実装されてるやつらはだいたいクライアントで使える
" The Node Toolbox - Category - Templating http://toolbox.no.de/categories/Templating

自分はcoffeekupが好き

現実的には

クライアントとサーバーで同じHTMLがレンダリングできる、多言語対応のmustache(+hogan.js)がよさそう。

自分がcoffeekupが好きなのは、HTMLを出力をする関数を持ったcoffee-scriptで、DSLをその場で定義できるから。学習コスト低いけど、なんでもできるので多人数の開発には向かなさそう。デフォルトエスケーピングオフだし・・・

クライアントサイドテンプレーティングの弱点

javascriptレンダリングするので、SEO壊滅的。
GoogleBotに対してコンテンツを保証したければページロード時のみサーバーで同じページをレンダリングして返すようにする必要がある。(Twitter方式)
クライアントとサーバーで同じテンプレートを保つ必要があって冗長
(よって多言語に対応してるmustacheに個人的に期待している。TwitterのサーバーはScala)

MVCフレームワーク

Backbone.js
Knockout.js
Spine.js
Batman.js

... いろいろあるけど TodoMVC http://addyosmani.github.com/todomvc/ をみるのがいい
それぞれのフレームワークでひたすらTODOリストを実装していて、実装例がみえる

まとめ

GoogleBotは早くJS解釈して window.onload まで読んでください
IEはさっさとPushState対応しろ(10で対応するそう)
SEO気にしない or SEO対策する手間を惜しまない or シングルページならこれらの技術群を導入する価値はある。