HMRの完成度アップ、ReducerのHMRも

昨日までで完成かと思ってたら、さらに続きが!

HMR環境で開発してたら、react-reduxのProviderコンポーネントが以下の警告をブラウザのstdoutに出してました。

does not support changing `store` on the fly. It is most likely that you see this error because you updated to Redux 2.x and React Redux 2.x which no longer hot reload reducers automatically. See https://github.com/reactjs/react-redux/releases/tag/v2.0.0 for the migration instructions.

ReduxもHMRできてましたか。昨日まではreactとreact-routerのスタックについてはHMRが完成していましたがさらにreduxのとこも。上記の警告中URL先のリリースドキュメントは日付が2015年8月ですからwebpackも古くrequireを用いたモジュール更新を必要としてましたが、webpack3の今ではもっとシンプルに書けます。

// Store.jsx
import { createStore, combineReducers, applyMiddleware } from 'redux';
import { routerReducer as router, routerMiddleware } from 'react-router-redux';
import { reducer as form } from 'redux-form';

import app from './AppReducer';
import moveToMiddleware from './MoveToMiddleware';

export default (history) => {
    const store = createStore(
        combineReducers({ app, router, form }),
        applyMiddleware(moveToMiddleware, routerMiddleware(history)),
    );
    if (module.hot) {
        module.hot.accept('./AppReducer', () => {
            store.replaceReducer(combineReducers({ app, router, form }));
        });
    }
    return store;
};

Reducerはステートレスだからホットに入れ替えてもアプリケーションの再描画が走らない!さらにとても素晴らしい動きになりました。reducerの取り替えだけなのでMiddlewareを書き換えると全画面再描画が走ります。