私のコードは問題なく動作していますが、コーディングの間違いを犯してランタイムエラーが発生するたびに、迷惑な問題が発生します。たとえば、JSXページの1つでDate()
の代わりにnew Date()
を実行し、実際のエラーを報告する代わりに...
Uncaught Error: Expected the reducer to be a function.
ほとんどすべてのエラーはこのように表示されます。以下のcreateStore.js
コードにあるconfigureStore.jsx
から報告されています。
実際の問題を特定するのに役立つ、より良いエラーレポートを取得する方法はありますか?ヘルプやアイデアは大歓迎です!!!
これが参考のための私のセットアップです...
main.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { ReduxRouter } from 'redux-router';
import configureStore from './store/configureStore'
import routes from './routes';
const rootEl = document.getElementById('app-container');
const store = configureStore();
ReactDOM.render(
<div>
<Provider store={store}>
<ReduxRouter routes={routes} />
</Provider>
</div>
, rootEl
);
configureStore.jsx
import { createHashHistory } from 'history';
import { applyMiddleware, createStore, compose } from 'redux';
import { reduxReactRouter } from 'redux-router';
import thunk from 'redux-thunk';
import promiseMiddleware from 'redux-promise-middleware';
import rootReducer from '../reducers/rootReducer';
import routes from '../routes';
export default function configureStore(initialState = {}) {
const history = createHashHistory();
const middlewares = [
thunk,
promiseMiddleware({
promiseTypeSuffixes: ['PENDING','SUCCESS','ERROR']
})
];
const toolChain = [
applyMiddleware(...middlewares),
reduxReactRouter({
routes,
history
})
];
const store = compose(...toolChain)(createStore)(rootReducer, initialState);
if (module.hot) {
module.hot.accept('../reducers', () => {
const nextRootReducer = require('../reducers/rootReducer');
store.replaceReducer(nextRootReducer);
});
}
return store;
}
rootReducer.jsx
import { combineReducers } from 'redux';
import { routerStateReducer } from 'redux-router';
import siteReducer from './siteReducer';
const rootReducer = combineReducers({
router: routerStateReducer,
sites: siteReducer
});
export default rootReducer;
siteReducer.jsx
import {GET_SITES} from '../actions/siteActions';
const defaultState = {
isPending: null,
isSuccess: null,
isError: null,
error: null,
data: null
};
export default function siteReducer(state = defaultState, action) {
switch (action.type) {
case `${GET_SITES}_PENDING`:
return {
...defaultState,
isPending: true
};
case `${GET_SITES}_SUCCESS`:
return {
...defaultState,
isSuccess: true,
error: false,
data: action.payload
};
case `${GET_SITES}_ERROR`:
return {
...defaultState,
isError: true,
error: action.payload
};
default:
return state;
}
}
次の行を変更します。
const nextRootReducer = require('../reducers/rootReducer');
に:
const nextRootReducer = require('../reducers/rootReducer').default;
使用する export const variable_name
の代わりに const variable_name
その変数をエクスポートしたいときはいつでも。
例:rootReducer.jsxは次のように書き直す必要があります
import { combineReducers } from 'redux';
import { routerStateReducer } from 'redux-router';
import siteReducer from './siteReducer';
export const rootReducer = combineReducers({
router: routerStateReducer,
sites: siteReducer
});
export default rootReducer;
Const rootReducerの追加のエクスポート指定子に注意してください
私の問題は、実際にバンドルされているストアルートではなく、ルートレデューサーパスからストアをインポートすることでした(ウィンドウ上のdevtoolsとルートレデューサー、ミドルウェアの構成など)。
import Store from '../../../src/state/Store/reducer';
に変わった
import Store from '../../../src/state/Store';