Reactjs Redux/React HMR<;供应商>;错误

Reactjs Redux/React HMR<;供应商>;错误,reactjs,redux,react-redux,typescript2.0,hot-module-replacement,Reactjs,Redux,React Redux,Typescript2.0,Hot Module Replacement,我正在尝试在Redux计数器示例(移植到typescript)上使用react hot loader v3设置HMR HMR实际上似乎是有效的,因为页面会更新,但第一次更新总是抛出warning.js?8f69:14不支持动态更改'store'。您很可能会看到此错误,因为您已更新到Redux 2.x和React Redux 2.x,不再自动热加载减速器。看见https://github.com/reactjs/react-redux/releases/tag/v2.0.0 查看迁移说明。 奇怪的

我正在尝试在Redux计数器示例(移植到typescript)上使用react hot loader v3设置HMR

HMR实际上似乎是有效的,因为页面会更新,但第一次更新总是抛出
warning.js?8f69:14不支持动态更改'store'。您很可能会看到此错误,因为您已更新到Redux 2.x和React Redux 2.x,不再自动热加载减速器。看见https://github.com/reactjs/react-redux/releases/tag/v2.0.0 查看迁移说明。
奇怪的是,在我重新加载页面之前,后续更新不会抛出这个(并继续工作)

我相信我已经按照医生说的方式安排好了,我不明白为什么会发生这种情况。我希望有人会遇到这个

index.ts

const store: Store<IAppState> = configureStore();
const rootEl = document.getElementById('root');

let render = () => {
    ReactDOM.render(
        <AppContainer>
            <Root store={ store }/>
        </AppContainer>,
        rootEl
    );
};

if (process.env.NODE_ENV !== 'production') {
    if ((module as any).hot) {
        (module as any).hot.accept(() => {
            setTimeout(render);
        });
    }
}

render();
let Root = (process.env.NODE_ENV === 'production') ?
    RootProd :
    RootDev;

export default Root;
export default class RootDev extends React.Component<IRootProps, void> {
  render() {
    const { store } = this.props;

    return (
      <Provider store={store}>
        <div>
          <CounterApp />
          <DevTools />
        </div>
      </Provider>
    );
  }
}
let configureStore = (process.env.NODE_ENV === 'production') ?
    configureStoreProd :
    configureStoreDev;

export default configureStore;
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const enhancer = composeEnhancers(
    applyMiddleware(thunk.default),
    DevTools.instrument(),
    persistState(
        window.location.href.match(/[?&]debug_session=([^&#]+)\b/) ?
            window.location.href.match(/[?&]debug_session=([^&#]+)\b/)[0] :
            'defaultDevSession'
    )
);

export default function configureStoreDev():Store<IAppState> {
    const store = createStore<IAppState>(rootReducer, enhancer);

    if ((<any>module).hot) {
        (<any>module).hot.accept('../reducers', () => {
            console.log('replaceReducer');
            store.replaceReducer(require('../reducers').rootReducer)
        });
    }

    return store;
}
root.dev.ts

const store: Store<IAppState> = configureStore();
const rootEl = document.getElementById('root');

let render = () => {
    ReactDOM.render(
        <AppContainer>
            <Root store={ store }/>
        </AppContainer>,
        rootEl
    );
};

if (process.env.NODE_ENV !== 'production') {
    if ((module as any).hot) {
        (module as any).hot.accept(() => {
            setTimeout(render);
        });
    }
}

render();
let Root = (process.env.NODE_ENV === 'production') ?
    RootProd :
    RootDev;

export default Root;
export default class RootDev extends React.Component<IRootProps, void> {
  render() {
    const { store } = this.props;

    return (
      <Provider store={store}>
        <div>
          <CounterApp />
          <DevTools />
        </div>
      </Provider>
    );
  }
}
let configureStore = (process.env.NODE_ENV === 'production') ?
    configureStoreProd :
    configureStoreDev;

export default configureStore;
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const enhancer = composeEnhancers(
    applyMiddleware(thunk.default),
    DevTools.instrument(),
    persistState(
        window.location.href.match(/[?&]debug_session=([^&#]+)\b/) ?
            window.location.href.match(/[?&]debug_session=([^&#]+)\b/)[0] :
            'defaultDevSession'
    )
);

export default function configureStoreDev():Store<IAppState> {
    const store = createStore<IAppState>(rootReducer, enhancer);

    if ((<any>module).hot) {
        (<any>module).hot.accept('../reducers', () => {
            console.log('replaceReducer');
            store.replaceReducer(require('../reducers').rootReducer)
        });
    }

    return store;
}
configureStore.dev.ts

const store: Store<IAppState> = configureStore();
const rootEl = document.getElementById('root');

let render = () => {
    ReactDOM.render(
        <AppContainer>
            <Root store={ store }/>
        </AppContainer>,
        rootEl
    );
};

if (process.env.NODE_ENV !== 'production') {
    if ((module as any).hot) {
        (module as any).hot.accept(() => {
            setTimeout(render);
        });
    }
}

render();
let Root = (process.env.NODE_ENV === 'production') ?
    RootProd :
    RootDev;

export default Root;
export default class RootDev extends React.Component<IRootProps, void> {
  render() {
    const { store } = this.props;

    return (
      <Provider store={store}>
        <div>
          <CounterApp />
          <DevTools />
        </div>
      </Provider>
    );
  }
}
let configureStore = (process.env.NODE_ENV === 'production') ?
    configureStoreProd :
    configureStoreDev;

export default configureStore;
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const enhancer = composeEnhancers(
    applyMiddleware(thunk.default),
    DevTools.instrument(),
    persistState(
        window.location.href.match(/[?&]debug_session=([^&#]+)\b/) ?
            window.location.href.match(/[?&]debug_session=([^&#]+)\b/)[0] :
            'defaultDevSession'
    )
);

export default function configureStoreDev():Store<IAppState> {
    const store = createStore<IAppState>(rootReducer, enhancer);

    if ((<any>module).hot) {
        (<any>module).hot.accept('../reducers', () => {
            console.log('replaceReducer');
            store.replaceReducer(require('../reducers').rootReducer)
        });
    }

    return store;
}
const composeEnhancers=(如有窗口)。\uuuu REDUX\u DEVTOOLS\u EXTENSION\uuuuu| | COMPOSE;
常量增强子=复合增强子(
applyMiddleware(thunk.default),
DevTools.instrument(),
持续状态(
window.location.href.match(/[?&]debug#u session=([^&#]+)\b/)?
window.location.href.match(/[?&]debug#u session=([^&#]+)\b/)[0]:
“defaultDevSession”
)
);
导出默认函数configureStoreDev():存储{
const store=createStore(rootReducer、enhancer);

如果((

我查看了项目代码库,没有找到启动它的脚本。我如何运行它?我实际上已经修复了它,但如果你想尝试它..cd然后
npm安装&&&&&./node_modules/.bin/webpack--config./webpack.server.js&&node dist/server.js
@XeroxDucati你能分享你最后做了什么来修复这个问题吗?运行我自己做了这件事,但不清楚您是如何从源代码处修复它的。@Krustal我在createStore中做了这件事:const store=createStore(require('../reducers').rootReducer,enhancer);/*istanbul ignore next*/if((module.hot){(module.hot.accept('../reducers'),()=>{store.replaceReducer(require('../reducers').rootReducer);});}@XeroxDucati感谢分享这绝对是解决方案。我很好奇如何做到这一点,并且仍然将initialState作为第二个参数传递,因为这似乎是我问题的根源。如果您将上述内容作为答案发布,我将很高兴提供追加投票。我查看了项目代码库,但没有找到启动它的脚本。我如何才能运行它?我确实修复了它,但如果你想尝试它..cd然后
npm安装&&&./node_modules/.bin/webpack--config./webpack.server.js&&node dist/server.js
@XeroxDucati你能分享一下你最终做了什么来修复这个问题吗?我自己遇到了这个问题,而且你从源头上做了什么还不清楚。@Kr我在createStore中这样做了:const store=createStore(require('../reducers').rootReducer,enhancer);/*innext*/if((module.hot){(module.hot.accept('../reducers'),()=>{store.replaceReducer(require('../reducers').rootReducer);});}@施乐杜卡迪感谢您分享这绝对是解决方案。我很好奇如何做到这一点,并仍然通过initialState作为第二个参数,因为这似乎是我的问题的根源。如果您发布上述作为一个答案,我很乐意提供支持投票。