MeteorとMEANの比較
Meteorの比較対象としてはMEANスタックが合っていますが、その比較記事を紹介します。原文はこちら
導入
まず初めに「MEAN」という名のスタックは存在しないということです。MEANはMongDB, Express, AngularJS, Node.jsの頭文字であり、それらを合わせて使うということでしかないです。一方、Meteorは完全なプラットォーム(フレームワークと多くのユーテリティ)です。
Meteorが標準で与えるもの
Meteorは標準で多くの機能を与えてくれます。クライアントとサーバはシームレスに通信し、何もコードを書かなくても自動更新してくれます。
MEANは4つが一緒になっただけで何もシームレスではありません。MongoDBとNode.jsの連携、ExpressとAngularの連携、REST APIとその呼び出しをすべてコーディングしなければなりません。これらは基本的なWebアプリを動かすのに必要ですが、Meteorではこれらに加えてさらに、ホットコードリロードやモバイル開発、リアクティブテンプレート、セッション管理、クライアントサーバ共通のパッケージが標準でついてきます。
MEANスタックではREST APIを使ってデータを要求しますが、Meteorではsubscribeすると更新のたびにデータが自動でWebSocket経由で送られてきます。
Meteorではクライアントとサーバで同じAPIを使うためフルスタックアプリケーションを開発するのが容易です。MEANスタックの場合は、クライアントとサーバは分離しているためそのようには行きません。
コールバック地獄なし
MeteorのサーバサイドはNode.js上で動きますが、Fibersを使ってcallbackを省略できるようにしています。クライアントサイドでもsimple TrackerとReactive Methodを使うことでコールバックだけでなくPromiseも省略できています。
リッチWebアプリケーションの7原則
Socket.IOの作者のGuillermo Rauchは「リッチWebアプリケーションの7原則」という記事を書きました。彼はトークもしています。
- サーバでのページ生成は任意ではない
- ユーザの入力に瞬時に動作する
- データの変更に反応する
- サーバでのデータ変換を制御する
- 履歴をこわさず、活用する
- コードの変更を反映させる
- 人の行動を予測する
Meteorは2,3,4,6を実装しています。1と5はパッケージによってサポートされています。7はフレームワークの仕事ではないでしょう。一方で、MEANスタックはこれらの一部を実現するSocket.IOを組み込む手間がかかります。Meteorはすべてをつないでいるのにです。
Meteorはまたツールチェインを持ち、Coffeescriptのコンパイルやファイルの結合およびminifyを実現します。ファイルを保存してから数秒でブラウザが更新されるのです。これは上記6に対応したホットコードプッシュのおかげです。
Meteor = MEANスタック + Socket.IO + grunt/gulp + Cordova + ホットコードプッシュ + もっとたくさん
例えば、accounts-facebook
というパッケージを使うとテンプレートに一行追加するだけで、Facebook認証の機能を使うことができます。他にも多くのパッケージがあります。さらに、Meteorでは一つのコマンドでアプリをデプロイすることができます。
どちらの方が簡単に学べるか?
でも、これらの機能を全部使えるには大変なのではないかって? 実はそうでもないんです。MeteorのシンプルさのおかげでMeteorはAngular一つを学ぶより簡単です。多くの人がAngularは学ぶのが大変で挫折すると言っています。
Meteorはその基本を一時間で学ぶことができます。公式チュートリアルを試してみてください。また公式ドキュメントもよく書かれています。それに対してMEAN.ioのドキュメントは話になりません。MEAN.JSのドキュメントには次のように書かれています。
ソースコードをダウンロードして、MongoDB, ExpressJS, AngularJS, Node.jsのドキュメントを読んだら、MEAN.JSのドキュメントに進みましょう。
Meteorのチュートリアルが一時間で終わるのであれば、それを試してからMEAN.ioやMEAN.JSを参照してもよいくらいでしょう。
もちろん製品アプリを作るのであればMeteorでもMongoDBの知識を学ぶ必要があります。しかし、当初はそれは必要ではありません。MeteorのドキュメントはよくあるMongoDBの使い方を説明しているからです。
コミュニティ
Meteorはすべてが一つに詰まっているため、情報検索にも有利です。
一方、MEANスタックはMEAN.ioとMEAN.JSのどちらを選ぶかから始めなくてはなりません。詳しくは、分離の理由やStackOverflowを参照してください。これによりGitHubスターは6000と2000程度に分断されました。Meteorは23000です。
StackOverflowではmeteorは10000の質問がありますが、mean,mean.io,meanjsを合わせても1100だけです。
コミュニティサイズについては、Why Meteorも参照してください。
どういうときにMeteorを使うべきではないか
他のツールでもあるように、Meteorが適さない場面もあります。これについてはWhy Meteorでも説明がありますが、MEANスタックが適する場面を見てみましょう。
- 既にほとんどのアプリの機能をMEANスタックで書いている場合。Meteorは追加メリットをもたらしますが、移行コストとの兼ね合いになるでしょう。
- REST APIのみを用いてサービスを作り、クライアントが不要な場合。Meteorはクライアント-サーバのプラットフォームですから。
- 開発するWebアプリにリアルタイム性がまったくいらない場合。リアルタイム性を実現するにはメモリとCPUのコストがかかります。
- WebアプリではなくWebサイトを作る場合。しかも、最初のページをできる限り速く表示したい場合。(プロトタイプをできる限り速く作りたいわけではなく)
- 現時点で数百万人のユーザにスケールさせる必要がある場合。
結論
これまでの経験から、Meteorは生産性が高いだけでなく、調査コストも下げました。アドバイスとしては、Meteorがいい選択肢かどうか「考える」のではなく、チュートリアルを一時間かけてやってみて、それからMEANスタックを調べて、どちらがよいか決めましょう。
感想
だいぶMeteor推しで、やりすぎ感(不公平感)もありますが、まず触ってから考えようというアドバイスは同意できます。また、Meteorを使わない方がよいシーンの説明は逆に使えるシーンが明確になって分かりやすいと思いました。