標高+1m

Don't be rational.

Meteorすごい

みなさんこんにちは。

最近僕のfeedlyにMeteorの記事がいくつか流れてきたので、気になって使ってみました。

MeteorJavaScriptフルスタックWebフレームワークです。 詳しい説明はこちらの連載がわかりやすかったです。 体感!JavaScriptで超速アプリケーション開発 -Meteor完全解説:連載|gihyo.jp … 技術評論社

僕が感動した点だけ書きます。

プラグイン

サードパーティのライブラリはnpmのものも使えるようですが、Meteor用のプラグインがいくつか用意されています。 プラグインはとても親切で、例えばmeteor add coffeescriptとかすればその時からコードの結合、サーバの再起動、ブラウザリフレッシュのフローに.coffeeファイルのコンパイルを挟んでくれます。

他にも、twitterfacebookgoogle、githubなんかのメジャーどこのOAuthをテンプレートタグ一個埋めるだけでできるようにしてくれるプラグインがあったりします。しかもこれ、OAuthの設定用にGUIが用意されます。

<template name="foo">
  {{loginButtons}}
</template>
DB

今のところDBのサポートはMongoDBだけなんですが、MongoDBのAPIもMeteor.Collectionによって厳重にラップされて、非常に簡単に扱えるようになっています。あと、後述しますがクライアントからDBに直結したMeteor.Collectionをいじれるのすごいです。ViewからModelを直接見れるのでらくちんです。

<template name="bar">
  <ul>
  {{#each users}}
    <li>{{this.profile.name}}</li>
  {{/each}}
  </ul>
</template>
Template.foo.users = -> Meteor.users.find {}

Model(DB上のデータ)が変わるとテンプレートが走ってViewが自動的に更新されるので、オブザーバパターンでModelの変更を見てjQueryでDOMをいじるみたいな従来のちまちました作業は全く必要なくなります。つまりViewはhandlebarsテンプレートだけで完結します。

サーバ

個人的に一番感動しているのは、サーバ側のコードがとても簡単に済むところです。Meteorではクライアントからサーバにある関数を呼び出せたり、クライアントのコードから直接DBのデータをいじれるので、Web APIを作る必要がなくなります。

普通のAPIサーバで、あるAPIを作るときは

  1. URLを決めて
  2. コントローラでリクエストを解釈して、モデルを呼んで
  3. モデルがDBからデータを取ってきて加工して (またはその逆)
  4. モデルの返り値をコントローラがJSONに丸めて返す

おおまかにこんな手順を踏むと思いますが、Meteorでは③の関数を一個書くだけでお仕舞です。これは開発スピードの向上にかなり貢献していると思います。JSON拡張のEJSONていうのをWebSocketに乗せてるっぽいです。

#普通なら

### サーバ ###

findUsers = (sel, opt, f) ->
  DB.users.find sel, opt, (err, result) -> f (gonyogonyo result) unless err

app.get "/users" (req, res) ->
  {selector, option} = gonyogonyo(req) #リクエストの解釈
  findUsers selector, option, (err, result) -> res.send(result)


### クライアント ###
Users.fetch()

Users.on "add", (x) -> #...
#Meteorなら

### サーバー ###

Meteor.methods
  findUsers: (sel, opt) -> gonyogonyo (Users.find sel, opt)

### クライアント ###
Meteor.call "findUsers", {}, {limit: 10}, (err, result) -> #...

#究極的にはサーバ側用のコードはいらない
同期関数

あと地味に便利なのはDBへのクエリなど普通jsでは非同期になるような関数がデフォルトで同期関数になっていることです。ちゃんと調べてないですが、1リクエストに付き1+スレッドというCGI風になっているんだと思います。コーディングのスピード重視ならやっぱりこっちの方が簡単。

ブラウザサポート

Meteorは裏でWebSocketをがっつり使うんですが、WebSocketが使えない環境ではajaxとかにフォールバックしてくれるそうで(正確にはMeteorが使っているNode.jsのライブラリ,Socket.IOがこれを吸収してくれます)、IE6以上のブラウザなら動くそうです。

What web browsers are supported by meteor web framework? - Stack Overflow

懸念点としては、ユーザ(とくに日本での)がまだ少ないらしいことくらいですね。お節介プラグインが盛り上がると楽しそう。

Meteorはとってもとってもオススメです。最近はcompojure + couch + hiccup + clojurescriptの構成がお気に入りだったんですが、Meteorのこのお手軽さには抗えませんでした。本当に楽。

サンプルコード貼りたいんですが試しに作ってみたものは公開できないものなのでまた今度ということで。

f:id:ympbyc:20131104230107j:plain

そうそう。lolcommitsが面白いです。なんかjson gemのバージョンのエラーが出るかもですがこのコミット当てれば使えます。