JavaScript
isomorphic
minimongo

minimongoでIsomorphic Storage

More than 3 years have passed since last update.

https://github.com/mWater/minimongo

npm install minimongo --save

minimongoは元々isomorphicフレームワーク(サーバーとクライアントのコードを同時に記述するパラダイム)のmeteorの中で使われてた使われた、コアとも言えるDB層であり、ブラウザでもサーバーでも動くように作られている。meteor触る時に一番特徴的な機能だと思う。

これがmeteorから単体で切りだされてForkされていた。meteorで使うのと多少APIが違うが、使える感じだった。(meteorは黒魔術的に非同期処理を隠蔽する機能があり、これをオミットしている)


良さ


  • 元々meteorの中で使われたので、比較的実績がある

  • mongo shell風のAPIがAPIがクライアントでも使える

僕はmongodb慣れてるのであのAPIでさっくりストレージを使いたい。

後者が目的でlokijs使ってたんだけど動作が不安定すぎて捨てた。


Isomorphic!

purejsで書かれていて、環境ごとにバックエンドを任意に切り替えられるのが最大の特徴。

高速なインメモリモード、クライアントでIndexedDbかWebSQLをバックエンドにしたモード、MongoのREST API に透過するモード、インメモリDBとリモートDBを組み合わせるハイブリットモードがある。(ハイブリッドDBがあるってのはREADMEにあるんだけど、どんな動きに異なるかは把握してない)

学習コストの都合上、インメモリでもなんらかのストレージがバックエンドでも同じようなAPIで叩けるのは強い。要求速度によってバックエンドを変更すればスケールもしなくもなさそう。

こういう、Meteor使わなくてもいいのでMeteorの資産がこういう風に使えるようになるのは嬉しい。

ちなみに今のChromeだとIndexedDbで5MB使える。最近はAtomShell使ってるんだけど、AtomShellだと130MBまで許可されてて強い。


サンプルコード

IndexedDb使う。

var minimongo = require('minimongo');

var test = new minimongo.IndexedDb('test');
test.addCollection('col');
test.col.upsert({a: 1}, function(){console.log('item 1 save done')});
test.col.upsert({a: 2}, function(){console.log('item 2 save done')});

// 取り出す
test.col.find().fetch(function(data){
console.log(data); // [{a:1, _id: 'a2e4ebeac1c540e19f2a71628dacf88d'}, {a:2, _id: "afd3841ce6c7477e9092087012a826e9"}]
})

IndexedDbを使えばちゃんと永続化されてる。

揮発して良いならnew minimongo.MemoryDb('test')でやればよい。


クライアントでインメモリDBというアプローチの嬉しさ


  • サーバーサイドっぽい開発アプローチがクライアントでも適用できる

  • ReactがIsomorphicっぽいので相性が良い

やっとクライアントサイドの開発ノウハウが揃ってサーバーの開発ノウハウを応用できるようになってきた感。

APIデザインについてはあとで自分とこのブログに書きたい。