Reduxのミドルウェアは、アクションがリデューサーに到達する前に、アクションを拡張したり処理したりするための機能を提供します。以下は、Reduxでよく使われるミドルウェアの一覧です。
1. redux-thunk
機能: アクションクリエーター内で非同期操作を扱うことができます。関数を返すアクションクリエーターを使用し、その中で非同期操作を実行し、操作が完了した後にアクションをディスパッチできます。
インストール:
npm install redux-thunk
使用例:
import { configureStore } from '@reduxjs/toolkit';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(thunk),
});
export default store;
2. redux-saga
機能: Generator 関数を使って副作用(非同期操作など)を管理します。redux-saga は、アクションをリッスンし、必要に応じて非同期操作を実行する強力な方法を提供します。
インストール:
npm install redux-saga
使用例:
import createSagaMiddleware from 'redux-saga';
import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers';
import rootSaga from './sagas';
const sagaMiddleware = createSagaMiddleware();
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(sagaMiddleware),
});
sagaMiddleware.run(rootSaga);
export default store;
Saga 定義:
import { takeEvery, call, put } from 'redux-saga/effects';
function* fetchDataSaga() {
try {
const response = yield call(fetch, 'https://api.example.com/data');
const data = yield response.json();
yield put({ type: 'FETCH_DATA_SUCCESS', payload: data });
} catch (error) {
yield put({ type: 'FETCH_DATA_FAILURE', payload: error.message });
}
}
export default function* rootSaga() {
yield takeEvery('FETCH_DATA_REQUEST', fetchDataSaga);
}
3. redux-logger
機能: 各アクションと状態の変化をログに記録します。Redux アプリケーションのデバッグに非常に便利です。
インストール:
npm install redux-logger
使用例
import { configureStore } from '@reduxjs/toolkit';
import logger from 'redux-logger';
import rootReducer from './reducers';
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),
});
export default store;
4. redux-promise
機能: アクション内で Promise オブジェクトを扱うことができます。このミドルウェアは Promise の成功または失敗を自動的に処理します。
インストール:
npm install redux-promise
使用例:
import { configureStore } from '@reduxjs/toolkit';
import promise from 'redux-promise';
import rootReducer from './reducers';
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(promise),
});
export default store;
5. redux-devtools-extension
機能: Redux DevTools 拡張と統合し、Redux ステートやアクションのリアルタイムでの表示を提供します。
インストール:
npm install redux-devtools-extension
使用例:
import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers';
import { composeWithDevTools } from 'redux-devtools-extension';
const store = configureStore({
reducer: rootReducer,
devTools: composeWithDevTools(),
});
export default store;
6. redux-immutable
機能: Redux ステートツリーを不可変にし、immutable.js と組み合わせて使用します。これにより、ステートツリーが毎回不可変であることが保証されます。
インストール:
npm install redux-immutable immutable
使用例:
import { configureStore } from '@reduxjs/toolkit';
import { combineReducers } from 'redux-immutable';
import { fromJS } from 'immutable';
import rootReducer from './reducers';
const store = configureStore({
reducer: combineReducers({
data: rootReducer
}),
preloadedState: fromJS({ /* 初期状態 */ })
});
export default store;
7. redux-observable
機能: RxJS ライブラリを使って副作用(非同期操作など)を処理します。redux-observable は、Observable を使用して非同期操作を管理します。
インストール:
npm install redux-observable rxjs
使用例:
import { createEpicMiddleware } from 'redux-observable';
import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers';
import rootEpic from './epics';
const epicMiddleware = createEpicMiddleware();
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(epicMiddleware),
});
epicMiddleware.run(rootEpic);
export default store;
Epic 定義:
import { ofType } from 'redux-observable';
import { switchMap } from 'rxjs/operators';
import { ajax } from 'rxjs/ajax';
import { of } from 'rxjs';
const fetchDataEpic = action$ =>
action$.pipe(
ofType('FETCH_DATA_REQUEST'),
switchMap(() =>
ajax.getJSON('https://api.example.com/data').pipe(
switchMap(response => of({ type: 'FETCH_DATA_SUCCESS', payload: response })),
catchError(error => of({ type: 'FETCH_DATA_FAILURE', payload: error.message }))
)
)
);
export default fetchDataEpic;
redux-thunk: 非同期操作を扱うためのミドルウェア。アクションクリエーター内で関数を返す。
redux-saga: Generator 関数を使って副作用を管理。
redux-logger: アクションや状態の変化をログに記録し、デバッグを支援。
redux-promise: アクション内の Promise オブジェクトを自動的に処理。
redux-devtools-extension: Redux DevTools 拡張と統合し、状態やアクションのリアルタイム表示を提供。
redux-immutable: Redux ステートツリーを不可変にする。
redux-observable: RxJS を使用して副作用を処理。