15 min/d

ぼうずやのにっき

bouzuya/rally-rxjs 0.2.0 をつくった

bouzuya/rally-rxjs の 0.2.0 をつくった。

rally-rxjs は bouzuya/vdom-rxjs-ssr をより実践的な形にしようという取り組みだ。過去に何度か書いている。

今回の 0.2.0 は rally-rxjs の Framework 部分を変更したものだ。 app の main は Observable<Action> を受けて Observable<Action> を返すだけで済むように変更した。次のような感じだ。

type app = (action$: Observable<Action>) => Observable<Action>;

これは 2016-02-24 に予告していた変更だ。Action が別の Action を誘発する場合の実装を変えるためのものだ。

0.1.0 では、 Subject<Action> を用意して Action の処理中に subject.next(action) を実行することで、別の Action を処理していた。この思いつきで差し込まれる subject.next(action) という副作用を消したかった。

0.2.0 では、すべてを Action の変換として扱うことにした。Observable<Action> を受け取り Observable<Action> を返す。0.1.0 での subject.next(action) が必要な場合には受け取った Action を別の Action に変換して流す。ほとんどは状態を変更する Action を受け取って描画する Action を返す形になる。

例を挙げる。

ほとんどの状態を変更して描画する例だ。 button を click して状態を変えるとすれば、 AddCountAction を受け取って state.count + 1 したあと RenderAction を返す。RenderAction は Framework 側で描画として処理され、もう App 側には投げ込まれない。

    (Framework) | (App)
                |
           +--->| ---+ 1. AddCountAction
           |    |    |
           |    |    |
 3. Render |    |    |
           +--- |<---+ 2. RenderAction
                |
                |

あるいは、 link を click して page を変えたとすれば、 ChangeRouteAction を受け取って FetchAction を返す。FetchAction は Framework 側で処理されず、再度 App 側に投げ込まれる。FetchAction を受け取って状態を変えて RenderAction を返す。

    (Framework) | (App)
                |      1. ChangeRouteAction
           +--->| ---+ 4. FetchAction
           |    |    |
 6. Render |    |    |
   3. NOOP |    |    |
           +--- |<---+ 2. FetchAction
                |      5. RenderAction
                |

render のような処理を追加する仕組みを提供するのが良さそう。App 側で初期化時に指定するのが良いと思う。まだそこまではできていない。

この Framework は Cycle.js の driver と似ているが、いくつかの点で異なる。ひとつは利用を副作用に限定しない点だ。ほかにも APIAction に制限している点だ。Flux のような Dispatcher を RxJS で実装しているだけなのだけど……。

0.3.0 では app 側に機能を追加して、0.4.0 では Framework 側を汎用的なものにしていきたい。