余白

https://blog.lacolaco.net/ に移転しました

Dartのサーバーフレームワーク

Redstoneはクソ

サーバーアプリを書くのに一番活発そうで一番潰れなさそうなRedstoneをとりあえず選んだ。結果的にクソだったけどよかった点もたくさんある。

良かった点

PythonのPyramidにインスパイアされてるっぽい。

  • mongoやpostgreのマッパーも提供してる

マッパーを提供というかマッパーとの接続のためのサブパッケージも配布してるので作りやすい

悪かった点

処理追うのめんどい

  • mongoのマッパーが不便

APIの不備というか、依存してるドライバライブラリが未熟感ある。前回の記事参照。

  • レスポンスのコンバートがクソ

これが一番でかい。RedstoneはURLのルーティングとバインドされた関数の戻り値の型によって自動でレスポンスの形式を切り替えてる。Stringの場合はそのままtext/plainで、MapかListならapplication/jsonで、FileならファイルのmimeTypeで返す。(http://redstonedart.org/doc/Routes.html)

ここで問題なのがStringでもMapでもListでもFileでもないオブジェクトを返した場合で、これは自動的にtoString()された結果がtext/plainでレスポンスになる。独自のクラスでtoString()を定義していなければその結果はInstance of Hogehogeという感じになり、まったく意味を成さない。たとえJSONっぽい文字列を返したとしても、text/plainなのでクライアント側でJSONとして扱えなかったりする。なのでJSONを返すAPIを実装したければ必然的に独自クラス→Mapの変換が必要になる。Mapにしたら型情報消えるしクラスベースの意味ねえだろ考えろ

RedstoneEncodableみたいなインターフェースを用意して、Map toMap()を実装させてくれればこんなの解決するんだがどうにもクソ。

他のフレームワーク漁ってみた。

というわけで他にいいのないか探してみた。pubでだらだら探しただけなので他にもいっぱいある。

dartrs

dartrsはシンプルにURLごとにハンドラを設定してレスポンスをwriteしていく形式。記述は増えるがなんでもできる。ただ最終アップデートが2013年なのが怖い。

cameleon

cameleonはもともとsdhsで、pubでは更新が止まってる。メタデータベースでRedstoneっぽいけどリダイレクトの処理とか簡単に書ける感じはある。しかし文字列しか返せないのでRedstone以下。

start

startはdartrsと同様にハンドラを設定してサーバーを起動する、という感じだが静的ファイルやディレクトリも指定できるので実用性が高い。URLのパラメータに?であってもなくてもいい指定ができたりするのもGood。 Sinatraにインスパイアされてるらしい。可もなく不可もなくというところ。

思うようなのがない

Redstoneが一番マシだった。つらい。ただ任意のクラスをJSON化してapplication/jsonで返すことだけを求めているのにどいつもこいつも文字列しか考えてない。クラスと型があることの意味を考えて欲しい。

そもそものパフォーマンス的な観点からもDartで本格的なサーバー書くの諦めてるので、特にモチベもあがらず自作することもないと思う。DartはWeb開発言語、もうそれでいいじゃないか。