Alminの0.10.0をリリースしました。

AlminはいわゆるFluxライブラリ的なものですが、ドメイン駆動設計(DDD)を行うにあたって既存のReduxFluxでは上手くレイヤリングがしにくい問題があったため作成しました。

この辺の経緯については以前スライドやドキュメントにまとめてあるので、以下を参照してください。

TypeScript

Almin 0.10.0ではコードベースがTypeScript化されました。

TypeScript

殆どの作業を@saneyukiさんがやってくれました。

以下のPRを見ると既存のJavaScriptプロジェクトを徐々にTypeScript化する流れが見れるので面白いと思います。

これにより、d.tsがnpmパッケージに同梱されるようになったので、TypeScriptからも扱いやすくなりました。

FlowType

Alminは以前からFlowTypeの型定義ファイルが同梱されていましたが、@k-kinzalさんにいくつかPRを頂いて、Declaration filesの扱いが改善されました。

サンプルプロジェクトにFlowで書いたTodoMVCがあるので、Flowと一緒に使いたい人は参照してみてください。

Logger

0.10.0の直接的なBreaking Changeとして、AlminのUseCase(Actionみたいなものです)やStoreの変更などのイベントハンドラの形式が統一的なものへと変更されました。 ハンドラにmetaオブジェクトが追加され、そのイベントがどこ(useCase)でいつ(timestamp)起きたのかというメタ情報を取れるようになりました。

この辺は普通の人にはあんまり関係なくてロガーのようなものを作っている場合に関係してきます。

Alminではalmin-loggerというコンソールにUseCaseの実行結果やStoreの変化をログとして吐くライブラリが用意されています。

via GIPHY

metaオブジェクトの導入によってこの辺のログ周りがより正確に出るように改善されました。

例えば、AlminではParentUseCaseの中でChildUseCaseを実行するといったネストしたUseCaseを扱えるような仕組みも持っています。 (トランザクション的なことがしたいときに使う)

metaオブジェクトの導入で親子関係のあるUseCaseも、その関係がログとして出せるようになっています。

nesting useCase

自分としては開発中のログは結構重視しているのでこの辺は充実させていきたいです。(実際のデバッグでかなり便利になるため)

最近はredux-devtools-extensionでAlminのログを出す連携を実験してみたりしています。

追記: 作ってみた almin/almin-devtools: Integrate almin into redux-devtools

どんなことに向いてるのか

Alminの設計思想としては普通に読めるようなコードで、中規模以上にスケールできようにするというものです。

よくあるFluxのサンプルでのカウントアプリのチュートリアルを見るとfacebook/fluxと殆ど変わらないことが分かるかもしれません。

Counter

ただ複雑なJavaScriptアプリケーションを考えながら作る話でも書いてますが、ドメインロジックをどこに書くのかという問題がfacebook/fluxReduxだと曖昧になりやすいです。

Alminは、その辺や非同期処理やStateの持ち方もある程度方針を持って扱えるようにするパターンやドキュメントなどを提供しています。

Almin Flow

今は、いくつかのプロダクションで数万行以上コードでもある程度安定して動いている感じです。

今後は報告してもらった問題に泥臭いチェックを入れたり、もう少し簡単にセットアップできるような方法を見ています。

また、TypeScriptの問題もまだ幾つかあるのでPR待っています!