store.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { applyMiddleware, createStore } from 'redux';
  2. import createSagaMiddleware from 'redux-saga';
  3. import { createLogger } from 'redux-logger';
  4. import { rootReducer } from 'reducers';
  5. import { rootSaga } from 'sagas';
  6. const SKIP_LOG_ACTIONS = (process.env.SKIP_LOG_ACTIONS || '').split(',');
  7. export function getStoreMiddleware(__DEV__) {
  8. const middleware = [rootReducer];
  9. if (__DEV__) {
  10. const devToolsMiddleware = window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__({
  11. actionsBlacklist: SKIP_LOG_ACTIONS
  12. });
  13. middleware.push(devToolsMiddleware);
  14. }
  15. return middleware;
  16. }
  17. export function makeCreateStoreWithMiddleware(__DEV__, sagaMiddleware) {
  18. const middleware = [sagaMiddleware];
  19. if (__DEV__) {
  20. const logger = createLogger({
  21. collapsed: true,
  22. predicate: (getState, action) => !SKIP_LOG_ACTIONS.includes(action.type)
  23. });
  24. middleware.push(logger);
  25. }
  26. return applyMiddleware(...middleware)(createStore);
  27. }
  28. function createCustomStore() {
  29. const __DEV__ = process.env.NODE_ENV === 'development';
  30. const __TEST__ = process.env.NODE_ENV === 'test';
  31. if (__TEST__) {
  32. return createStore(rootReducer);
  33. }
  34. const sagaMiddleware = createSagaMiddleware();
  35. const createStoreWithMiddleware = makeCreateStoreWithMiddleware(__DEV__, sagaMiddleware);
  36. const store = createStoreWithMiddleware(...getStoreMiddleware(__DEV__));
  37. let sagaTask = sagaMiddleware.run(function *getSagas() {
  38. yield rootSaga();
  39. });
  40. if (__DEV__ && module.hot) {
  41. module.hot.accept('./reducers', () => {
  42. // eslint-disable-next-line global-require
  43. store.replaceReducer(require('./reducers').rootReducer);
  44. });
  45. module.hot.accept('./sagas', () => {
  46. // eslint-disable-next-line global-require
  47. const newRootSaga = require('./sagas').rootSaga;
  48. sagaTask.cancel();
  49. sagaTask.done.then(() => {
  50. sagaTask = sagaMiddleware.run(function *replacedSaga() {
  51. yield newRootSaga();
  52. });
  53. });
  54. });
  55. }
  56. return store;
  57. }
  58. export { createCustomStore as createStore };