Inroducing Almin 0.10.0: TypeScript, FlowType, Logger
Alminの0.10.0をリリースしました。
AlminはいわゆるFluxライブラリ的なものですが、ドメイン駆動設計(DDD)を行うにあたって既存のReduxやFluxでは上手くレイヤリングがしにくい問題があったため作成しました。
この辺の経緯については以前スライドやドキュメントにまとめてあるので、以下を参照してください。
- azu/large-scale-javascript: 複雑なJavaScriptアプリケーションを作るために考えること
- 複雑なJavaScriptアプリケーションを考えながら作る話
- アーキテクチャをめぐるたび | Web Scratch
TypeScript
Almin 0.10.0ではコードベースが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)起きたのかというメタ情報を取れるようになりました。
- Proposal: Introduce
meta
object to Dispatcher#dispatch(payload, meta) · Issue #61 · almin/almin - Breaking Change: feat(Dispatcher): Introduce DispatcherPayloadMeta by azu · Pull Request #62 · almin/almin
この辺は普通の人にはあんまり関係なくてロガーのようなものを作っている場合に関係してきます。
Alminではalmin-loggerというコンソールにUseCaseの実行結果やStoreの変化をログとして吐くライブラリが用意されています。
meta
オブジェクトの導入によってこの辺のログ周りがより正確に出るように改善されました。
例えば、AlminではParentUseCaseの中でChildUseCaseを実行するといったネストしたUseCaseを扱えるような仕組みも持っています。 (トランザクション的なことがしたいときに使う)
meta
オブジェクトの導入で親子関係のあるUseCaseも、その関係がログとして出せるようになっています。
自分としては開発中のログは結構重視しているのでこの辺は充実させていきたいです。(実際のデバッグでかなり便利になるため)
最近はredux-devtools-extensionでAlminのログを出す連携を実験してみたりしています。
Redux DevTools Redux以外でも動かせるんだ。
— azu (@azu_re) March 8, 2017
Alminで一応できた pic.twitter.com/b0uvdEwd83
- Integration with redux-devtools-extension · Issue #115 · almin/almin
- Redux用のブラウザ拡張だけど、その他のライブラリと連携するAPIが用意されている
追記: 作ってみた almin/almin-devtools: Integrate almin into redux-devtools
https://t.co/CmAMJReV3W
— azu (@azu_re) March 9, 2017
AlminのログをRedux DevTools Extensionに流すやつとりあえず動いてきた。 pic.twitter.com/Fer2fRaN0N
どんなことに向いてるのか
Alminの設計思想としては普通に読めるようなコードで、中規模以上にスケールできようにするというものです。
よくあるFluxのサンプルでのカウントアプリのチュートリアルを見るとfacebook/fluxと殆ど変わらないことが分かるかもしれません。
ただ複雑なJavaScriptアプリケーションを考えながら作る話でも書いてますが、ドメインロジックをどこに書くのかという問題がfacebook/fluxやReduxだと曖昧になりやすいです。
Alminは、その辺や非同期処理やStateの持ち方もある程度方針を持って扱えるようにするパターンやドキュメントなどを提供しています。
今は、いくつかのプロダクションで数万行以上コードでもある程度安定して動いている感じです。
今後は報告してもらった問題に泥臭いチェックを入れたり、もう少し簡単にセットアップできるような方法を見ています。
- test(UseCase): add isolated nesting usecase by azu · Pull Request #116 · almin/almin
- Proposal: almin-react-container · Issue #112 · almin/almin
また、TypeScriptの問題もまだ幾つかあるのでPR待っています!
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。