2016-02-27 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 と似ているが、いくつかの点で異なる。ひとつは利用を副作用に限定しない点だ。ほかにも API を Action
に制限している点だ。Flux のような Dispatcher を RxJS で実装しているだけなのだけど……。
0.3.0 では app 側に機能を追加して、0.4.0 では Framework 側を汎用的なものにしていきたい。