@@ -16,7 +16,7 @@ Reduxには[Three Principles](http://redux.js.org/docs/introduction/ThreePrincip
1616 - StateはActionを経由しないと書き換えることができない
1717- Changes are made with pure functions
1818 - Actionを受け取りStateを書き換えるReducerと呼ばれるpure functionを作る
19-
19+
2020この三原則についての詳細はドキュメントなどを参照してください。
2121
2222- [ Read Me | Redux] ( http://redux.js.org/ )
@@ -55,8 +55,10 @@ Reduxの例として次のようなコードを見てみます。
5555dispatch(action) -> (_Middleware_ の処理) -> reducerにより新しいStateの作成 -> (Stateが変わったら) -> subscribeで登録したコールバックを呼ぶ
5656```
5757
58+ - [ ] 図にしたほうがいい
59+
5860次は _ Middleware_ によりどのような拡張ができるのかを見ていきます。
59-
61+
6062## Middleware
6163
6264Reduxでは第三者が拡張できる仕組みを _ Middleware_ と呼んでいます。
@@ -128,22 +130,72 @@ const middleware = (store) => {
128130
129131[ import, logger.js] ( ../../src/Redux/logger.js )
130132
133+ - [ ] ログを挟んでいる図
134+
131135この場合の ` next ` は ` dispatch ` と言い換えても問題ありませんが、複数の _ Middleware_ を適応した場合は、
132136** 次の** _ Middleware_ を呼び出すという事を表現しています。
133137
134- Reduxの _ Middleware_ の仕組みは単純ですが、見慣れないデザインであるために複雑であるように見えます 。
138+ Reduxの _ Middleware_ の仕組みは単純ですが、見慣れないデザインなので複雑に見えます 。
135139実際に同じ仕組みを実装しながら、Reduxの _ Middleware_ について学んでいきましょう。
136140
137141## どういう仕組み?
138142
139- - 高階関数をapplyしている
140- - http://rackt.github.io/redux/docs/advanced/Middleware.html
141- - その機構のコードへのリンク
142- - その仕組みやプラグインについてドキュメントへのリンク
143+ _ Middleware_ は` dispatch ` をラップする処理ですが、そもそも` dispatch ` とはどういう事をしているのでしょうか?
144+
145+ 簡潔に書くと、Reduxの` store.dispatch(action) ` は` store.subscribe(callback) ` で登録した` callback ` に`actionを渡し呼び出すだけです。
146+
147+ これよくみるPub/Subのパターンですが、今回はこのPub/Subパターンの実装からみていきましょう。
148+
149+ ### Dispatcher
150+
151+ [ ESLint] ( ../ESLint/README.md ) と同様でEventEmitterを使い、` dispatch ` と` subscribe ` を持つ` Dispatcher ` を実装すると以下のようになります。
152+
153+ [ import, Dispatcher.js] ( ../../src/Redux/Dispatcher.js )
154+
155+ ` Dispatcher ` はActionオブジェクトを` dispatch ` すると、` subscribe ` で登録されていたコールバック関数を呼び出すという単純なものです。
156+
157+ また、この` Dispatcher ` の実装はReduxのものとは異なるので、あくまで理解のための参考実装です。
158+
159+ > Unlike Flux, Redux does not have the concept of a Dispatcher
160+ > This is because it relies on pure functions instead of event emitters
161+ > -- [ Prior Art | Redux] ( http://redux.js.org/docs/introduction/PriorArt.html " Prior Art | Redux ")
162+
163+ ### applyMiddleware
164+
165+ 次に、 _ Middleware_ を適応する処理となる ` applyMiddleware ` を実装していきます。
166+ 先ほども書いたように、 _ Middleware_ は ` dispatch ` を拡張する仕組みです。
167+
168+ ` applyMiddleware ` は` dispatch ` と _ Middleware_ を受け取り、 _ Middleware_ で拡張した ` dispatch ` を返す関数です。
169+
170+ [ import, apply-middleware.js] ( ../../src/Redux/apply-middleware.js )
171+
172+ この` applyMiddleware ` はReduxのものと同じなので、
173+ 次のように _ Middleware_ を適応した ` dispatch ` 関数を作成できます。
174+
175+ [ import, apply-middleware-example.js] ( ../../src/Redux/apply-middleware-example.js )
176+
177+ ` applyMiddleware ` で` timestamp ` をActionに付加する _ Middleware_ を適用しています。
178+ これにより` dispatchWithMiddleware(action) ` した` action ` には自動的に` timestamp ` プロパティが追加されています。
179+
180+ ``` js
181+ const dispatchWithMiddleware = applyMiddleware (createLogger (), timestamp)(middlewareAPI);
182+ dispatchWithMiddleware ({type: " FOO" });
183+ ```
184+
185+ ここで _ Middleware_ には` middlewareAPI ` として定義した2つのメソッドを持つオブジェクトが渡されています。
186+ しかし、` getState ` は読み込みのみで、_ Middleware_にはStateを直接書き換える手段が用意されていません。
187+ また、もう1つの` dispatch ` もActionオブジェクトを書き換えられますが、結局できることは` dispatch ` するだけです。
188+
189+ この事から _ Middleware_ にも三原則が適用されている事が分かります。
190+
191+ - State is read-only
192+ - StateはActionを経由しないと書き換えることができない
143193
144- ## 実装してみよう
194+ _ Middleware_ という仕組み自体は[ Connect] ( ../connect/README.md ) と似ています。
195+ しかし、 _ Middleware_ が直接的に結果(State)を直接書き換える事はできません。
145196
146- - [ ] DispatcherベースのMiddleware
197+ Connectの _ Middleware_ は最終的な結果(` response ` )を書き換えできます。
198+ 一方、Reduxの _ Middleware_ は扱える範囲が` dispatch ` からReducerまでと線引されている違いと言えます。
147199
148200## どういう事に向いてる?
149201
@@ -165,4 +217,4 @@ Reduxの _Middleware_ の仕組みは単純ですが、見慣れないデザイ
165217
166218
167219
168- [ Redux ] : https://github.com/reactjs/redux " reactjs/redux: Predictable state container for JavaScript apps "
220+ [ Redux ] : https://github.com/reactjs/redux " reactjs/redux: Predictable state container for JavaScript apps "
0 commit comments