QA@IT

クライアントサイドMVCを使ったときのサーバサイドの役割

7909 PV

Backbone.jsやAngularJSなどフロントエンド(クライアントサイド)のMVCフレームワークを使う場合、
サーバサイドの役割はどう変わるのでしょうか?

例えばサーバサイドでMVCフレームワークを使っていて、Model->Controller->Viewとデータを渡して動的なhtmlを吐いてたりしたのは、
クライアントサイドで行うようになって不要になる気がするんですが…その辺あまり分かっていなくて困っています。

環境はnode.js+express, MongoDBで開発することを考えています。
node.jsのチュートリアルの例では、app.jsやroutes/index.jsなどでルーティングを行い、view(jadeファイル)にデータを渡し、そのデータを使って動的なページを作るようなものがほとんどですが、
クライアントサイドがヘビーなプログラムになる場合、サーバサイドのプログラミングはそれとは違ったものになるのでしょうか。

また、一つのWebアプリケーションの中で、クライアントサイドjsが必要な部分とそうでない部分に、機能として大きく分けられるときは、それぞれサーバサイドの役割が変わってくるのでしょうか?
(例:前者に対してはJSONを吐くAPI, 後者に対しては動的なページを作成するなど・・・)

抽象的な質問で申し訳ありませんが、どうぞよろしくお願いいたします。

回答

おっしゃる通り、サーバの主な役割は HTML を生成することから JSON API を提供することに変わります。すべての動的なデータを API 経由で提供し、他はすべてクライアントサイドで制御するなら HTML はそれこそ静的に生成されたもので構いません。例えば Travis CI はそのような作りになっています。

例えば Twitter API を使うと Twitter クライアントを作ることができますよね。iOS 用クライアント、Android 用クライアントなど様々なものがあって、そのなかのひとつとして HTML と JavaScript でできたクライアント (= twitter.com) がある、というようなイメージです。

とはいえ、すべてのドメインロジックがクライアントに移るわけでもありません。アクセス制御はもちろんとして、更新系で整合性を保つこと、クライアントの必要に応じた粒度でリソースをエクスポートすることなどはサーバサイドの責務です。データベースのレコードをそのままエクスポートするだけではこれらを実現できないので、サーバサイドでも MVC フレームワークを用いることは普通にありえることです。この場合、View は HTML の代わりに JSON を生成することになるでしょう。

また、一つのWebアプリケーションの中で、クライアントサイドjsが必要な部分とそうでない部分に、機能として大きく分けられるときは、それぞれサーバサイドの役割が変わってくるのでしょうか?

その通りです。

編集 履歴 (0)
  • ご回答有り難うございました。右も左もの状態でなかなか調べても分からなかったので、方向性を示して頂けた事に大変感謝しています。
    > iOS 用クライアント、Android 用クライアントなど様々なものがあって、そのなかのひとつとして
    サーバサイドはどれに対しても同じようにJSON等を出すということですね。納得いたしました。
    -
  • 大変勉強になりました。始めたばかりでレピュテーションが足りず+1出来なくてすみません。このような素晴らしいサービスが今後ますます発展するのを願っています。ありがとうございました。 -

基本的にMVCパターンは、一つのアプリケーション内で完結するものです。
クライアントサイドとか、サーバーサイドとかいう概念はありません。
Ajaxなどを使ったリッチクライアントの場合は、「クライアントとサーバーを合わせて、一つのアプリケーションとみなす」ことが必要だと思います。
あとは、Model、View、Controllerの役割を考えれば、おのずと答えが出て来ると思います。

編集 履歴 (0)
  • ご回答ありがとうございました。始めたばかりでレピュテーションが足りず+1出来なくてすみません。MVCパターンについては熟知しているつもりでしたが、おのずと答えが出ず恐縮ですが… -
  • うーん。。。おそらくMVCパターンを熟知していないから今回のような質問に繋がったのでは?MVCパターンには「Model->Controller->View」このようなデータの流れは基本的にありません。 -
  • 失礼しました。WebアプリケーションのMVCに関してはおっしゃる通り無知で、上のはCのコードの中にMを入れている(CがMを知っている)状態からVで使えるようにするのを書いたつもりでした。GUIアプリケーションでのMVCでVがMを知っていてObserverで監視するパターンは馴染みが深いのですが。。 -
  • MVCパターンには、Webアプリ版MVCとかGUIアプリ版MVCと言った分類はないはずです。また、ViewはModelを参照しますが、その参照する際の経路上に偶然Controllerがいたとしても、それはどうでもよいことです。あと、qsonaさんの話は「設計」と「実装」の話がごちゃまぜになっているように感じます。MVCは設計に関する話です。 -
  • 引き続きコメント頂き感謝しています。MVCは広い概念ですが、実際のところはGUIに使われるMVCとサーバサイド(典型的にRails)に使われるそれでは形がずいぶん違うものと理解しています。またクライアントサイドMVCというタイトルが変な書き方だったかもしれませんが、これはBackboneを筆頭とするクライアントサイドMVCフレームワークについて述べたつもりでした。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。