導入

まず初めに「MEAN」という名のスタックは存在しないということです。MEANはMongDB, Express, AngularJS, Node.jsの頭文字であり、それらを合わせて使うということでしかないです。一方、Meteorは完全なプラットォーム(フレームワークと多くのユーテリティ)です。

Meteorが標準で与えるもの

Meteorは標準で多くの機能を与えてくれます。クライアントとサーバはシームレスに通信し、何もコードを書かなくても自動更新してくれます。
image
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 TrackerReactive Methodを使うことでコールバックだけでなくPromiseも省略できています。

リッチWebアプリケーションの7原則

Socket.IOの作者のGuillermo Rauchは「リッチWebアプリケーションの7原則」という記事を書きました。彼はトークもしています。
  1. サーバでのページ生成は任意ではない
  2. ユーザの入力に瞬時に動作する
  3. データの変更に反応する
  4. サーバでのデータ変換を制御する
  5. 履歴をこわさず、活用する
  6. コードの変更を反映させる
  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を使わない方がよいシーンの説明は逆に使えるシーンが明確になって分かりやすいと思いました。