@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Single Page Application ではない場合 JavaScript コードのエントリポイントはどこにあるべきか?

仕事で中規模程度の Rails アプリケーションのコードベースをいじっている。このアプリはもともと app/assets/javascripts 以下に必要に応じて JavaScript ファイルを置き、適当なテンプレートファイルから直接 JavaScript の関数を呼び出したりしていた。ごく普通の Rails アプリである。

このアプリは CMS で、いわゆる「ブログの管理画面」みたいな用途で使われている。一部の機能はそれなりに込み入った UI 操作を必要としページ遷移なしに操作できる必要があるが、旧来のやり方では JavaScript コードの管理が間に合わなくなってきたので部分的に Backbone.js を導入し始めている。

最近悩んでいるのが、 Backbone.js なコードのエントリポイントをどのように呼び出すべきなのか?ということ。そもそも自分が Backbone.js なり JavaScript なりの流儀に疎いということもあるが、現状では旧来のやり方を引きずってテンプレート内で Backbone.View を継承した自前の View クラスを new したりしている。が、コードが追いづらくてイマイチな気がしている。

気になったので Backbone.js の導入事例紹介ページ にあるもののうち名前を知ってるサービスのページを見てみたが、調査力不足でよくわからなかった。

  • DocumentCloud

    • index.html の一番下、 $.ready の中で dc.app.workspace = new dc.controllers.Workspace; を呼び出している
    • dc.controllers.Workspace は Backbone.Router を extend しており、こいつの initialize のなかで Backbone.hisotry.start を呼び出している
  • Hulu

    • Hulu.Utils. 的なのの中から Backbone.hisotry.start を呼んでいる形跡がある
    • が、具体的に html のどこで導火線に火をつけているのかはよくわからず
  • GILT

    • どこで発火してるかさっぱりわからず
  • Wordpress.com

    • Notification のページで使っているらしいがログインしてないのでわからず
  • Delicious

    • Chaplin.js を使ってると素の Backbone.js とはだいぶ事情が違うよなぁ、と思い調べず
  • Foursquare

    • underscore.js は使ってるようだが backbone.js をどこで利用してるかすらわからず
  • Khan Academy

    • index.html の下の方で Homepage.init というのを呼び出しておりこいつがエントリポイントっぽい
    • Homepage.init の中からいろいろ芋づる式にコードが呼び出されているが Backbone.history.start を呼んでるかどうかはわからず
  • Basecamp

    • Backbone.history を使っていそうだが、内部でいろいろやってて具体的にどこから発火してるのかわからず

さすがに DocumentCloud は Backbone.js を作っただけあってお手本通りな使い方をしているだろう、と考えると、 Backbone.history.start を呼ぶことで(編集済み:Backbone.history の役割について勘違いしていた) Router からいろいろ発火していく、という風にするのがきれいなのかな、という気がする。しかし、 SPA ではないふつうのアプリの場合、ページ遷移はそこかしこで発生するので Router はあんまり役に立たないような気もする。

「実質ルーティングが発生しないとしても、 Backbone.js アプリでは必ず Router から一連のコードが実行されるように統一すべき」とも思えるし、しかし「ルーターとしての用をなさないのに余分なものを導入してはかえって見通しが悪くなるので html から直接 View を new するなりすべき」と言われたら反論できる気もしない。今のところ 7:3 くらいで、必ず Router を通す、を試してみたい気はしている。

みなさんどうやっているんでしょうか。