2016-04-26 6 views
1

schnell nachgeladen wird Ich verwende Redux mit React Native und HMR. Wenn ich ein Reduktions ändern, nehmen die Blasen bis zu meiner configureStore.js-Datei, die diese Anrufe:Stack-Überlauf, wenn ein Reducer mit React Native und Redux

if (module.hot) { 
    module.hot.accept(() => { 
     const nextRootReducer = require('../reducers/index').default; 
     store.replaceReducer(nextRootReducer); 
    }); 
} 

Aber dann hält HMR auf die Referenzen in einer Schleife, bis der Stapelüberlauf zu suchen. Könnte es sein, dass es irgendwo einen Zirkelbezug gibt? Wenn ja, irgendwelche Tipps, um es aufzuspüren? Ich habe versucht, durch den Code require.js zu gehen, aber die "Referenzen" werden nur als Zahlen gehalten, die es schwer machen, die richtige Datei aufzuspüren.

+0

Ich habe ein ähnliches Problem. Das anfängliche "Store" -Objekt für mich wird undefiniert, was - obwohl nicht idiomatisch - ein Problem ist, wenn Sie 'store' direkt verwenden. Zuerst war das das einzige Problem, aber im Laufe der Zeit bricht es jetzt alle zusammen (roter Bildschirm des Todes), wenn ich den Reducer aktualisiere. Ich gehe davon aus, dass ich Pakete wie 'redux-storage' oder eine andere Middleware hinzugefügt habe. Das Aktualisieren von Aktionen ist noch mehr ein Problem - diese funktionierten nie gut. Meine Annahme ist, dass ich mehr in der Funktion tun muss, die an 'module.hot.accept' übergeben wird. I.e. Wiederholen Sie alles, was ich ursprünglich in 'configureStore' gemacht habe. –

+0

UPDATE: Deine Frage brachte mich dazu, wieder darüber nachzudenken, und ich habe es endlich gelöst lol. Ich bin mir nicht sicher, ob es auf dich zutrifft, aber was ich getan habe, sind zwei Dinge: Ich habe genau das gemacht, was ich angenommen habe, als ich den Laden nicht richtig mit Redux-Speicher neu konfiguriert habe, also habe ich das gemacht. I.e. Ich stellte sicher, dass alle vorherigen Schritte zum Einrichten des Reduzierers erneut in "module.hot.accept" durchgeführt wurden. Dann, was die Aktionen betrifft, habe ich aufgehört, sie in meine 'configureStore'-Datei zu importieren, da ich sie nicht verwendete - das Problem wurde behoben, bei dem das Ändern meiner Aktionsdateien den Speicher durchbrach, der den Änderungen. –

Antwort

0

Hier ist meine genauen Code, wenn Sie es untersuchen wollen:

export default function configureStore() { 
    engine = createEngine('appstate'); 
    engine = filter(engine, null, ['appStateLoaded', 'appReady', 'tourReady', 'tourPage', 'tooltipStep', 'connected']); 
    const cacheState = storage.createMiddleware(engine); //OLD PARAMETER: , [LOAD, 'SET_TOUR_READY', 'SET_TOUR_PAGE'] ... replaced by reducer key filtering above instead 

    enhancer = compose(
    applyMiddleware(thunk, cacheState), 
    devTools({ 
     name: Platform.OS, 
     hostname: '10.0.1.201', 
     port: 5678, 
     filters: {blacklist: ['REDUX_STORAGE_SAVE']} 
    }) 
); 

    //reset reducer state on LOGOUT 
    const appReducer = combineReducers(reducers); 
    const rootReducer = (state, action) => { 
    if (action.type === LOGOUT) { 
     state = undefined; 
    } 

    return appReducer(state, action); 
    } 

    reducer = storage.reducer(rootReducer); 


    store = createStore(reducer, enhancer); 

    //retreive previously cached state and inject into Redux store! 
    const load = storage.createLoader(engine); 
    load(store) 
     .then((newState) => console.log('Loaded state:', newState)) 
     .catch(() => console.log('Failed to load previous state')); 


    if(module.hot) { 
    module.hot.accept(() => { 
     let nextRootReducer = storage.reducer(rootReducer); 
     store.replaceReducer(nextRootReducer); 

     load(store) 
      .then((newState) => console.log('Loaded state:', newState)) 
    }); 
    } 

    return store; 
} 

Es sollte Ihnen ein solides Beispiel dafür, wie mit module.hot.accept verschiedenen Middleware zu verwenden. ... Soweit die "Zirkelreferenz" Sache geht - das einzige, was zu tun ist, überprüfen Sie Ihre Reduzierungen und stellen Sie sicher, dass sie sich nicht gegenseitig importieren. Ich denke, ich habe dieses genaue Problem in der Tat gesehen - ES6-Module können das anfängliche Bauen der Zyklen richtig ansprechen, aber vielleicht kann der HMR-Bauprozess nicht. Und das ist alles. Sie denken also, Sie haben Code, der funktioniert, aber HMR wird im Grunde nicht unterstützt. Ich habe eine schnelle Test-App eingerichtet und implementiere ihren hot.module.accept Code und verifiziere, dass er für dich funktioniert. Vielleicht müssen Sie eine Sache anpassen - aber da Sie so wenig Code haben, wird es leicht zu finden sein - und dann denselben Fehler in Ihrem eigenen Code machen. Wenn das Problem dadurch nicht behoben wird, minimieren Sie das, was Sie mit Redux tun, vorübergehend in Ihrer App, bis Sie feststellen, was das Problem verursacht hat. ..Wish Ich hatte mehr Vorschläge für dich.

Verwandte Themen