Kürzlich bin ich auf einen Fehler in meiner Redux-Codebasis gestoßen, der mir den Kopf zerbrochen hat. Wenn Sie jemals diese plötzliche Welle der Verwirrung gespürt haben, wenn die Testsuite einen Fehler auslöst, der keinen Sinn ergibt, kennen Sie das Gefühl. Hier erfahren Sie, was passiert ist und wie ich das Problem schließlich gefunden (und behoben) habe.
Eine zirkuläre Abhängigkeit tritt auf, wenn zwei oder mehr Module direkt oder indirekt voneinander abhängig sind und eine Endlosschleife in der Abhängigkeitskette entsteht. Mit anderen Worten: Es ist, als würden zwei Freunde sagen: „Du gehst zuerst“, aber niemand rührt sich jemals. In JavaScript kann dies zu undefinierten Modulen oder unvollständigen Daten führen, was zu Fehlern führt, die unglaublich schwer zu verfolgen sind.
Stellen Sie sich zwei JavaScript-Dateien vor, moduleA.js und moduleB.js:
// moduleA.js import { functionB } from './moduleB.js'; export function functionA() { console.log('functionA called'); functionB(); } // moduleB.js import { functionA } from './moduleA.js'; export function functionB() { console.log('functionB called'); functionA(); }
Hier sind beide Module voneinander abhängig. Wenn JavaScript versucht, sie zu laden, kommt es zu Verwirrung, da keiner vollständig geladen werden kann, ohne dass der andere zuerst bereit ist. Dies führt zu Problemen wie undefinierten Funktionen oder unvollständigen Modulen – im Grunde ein Durcheinander.
Ah, der gefürchtete Fehler, der dieses Abenteuer auslöste:
Error: `reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers. ❯ Module.configureStore node_modules/@reduxjs/toolkit/src/configureStore.ts:98:11
Meine erste Reaktion? „Warte, was?!“ – nicht mein schönster Moment. Ich war mir sicher, dass meine Reduzierstücke vorhanden waren, daher schien dieser Fehler aus dem Nichts zu kommen. Nach einigem Recherchieren wurde mir klar, dass es sich hierbei nicht um ein Problem mit fehlenden Reduzierern handelte, sondern um eine zirkuläre Abhängigkeit, die sich in mein Redux-Setup eingeschlichen hatte. Das herauszufinden war natürlich nicht einfach!
Da habe ich meinen Retter gefunden: das NPM-Paket dpdm. Dieses Juwel analysiert Ihren Abhängigkeitsbaum und zeigt Ihnen, wo diese hinterhältigen zirkulären Abhängigkeiten leben. Das Ausführen des folgenden Befehls verschaffte mir eine klare Sicht:
dpdm --no-warning --no-tree ./src/index.tsx
Und voilà! Hier ist ein Vorgeschmack auf das, was es in meinem Projekt gefunden hat:
• Circular Dependencies 01) src/stores/store.ts -> src/stores/rootReducer.ts -> src/stores/slice/authSlice.ts -> src/utilities/api.ts 02) src/stores/rootReducer.ts -> src/stores/slice/bookingSlice.ts -> src/hooks/redux.tsx -> src/stores/types.ts -> src/stores/setUpStore.ts 03) src/stores/types.ts -> src/stores/setUpStore.ts ...
Der Bericht war klar: In meinen Redux-Dateien gab es eine Reihe zirkulärer Abhängigkeiten, hauptsächlich in store.ts, rootReducer.ts und einigen Slices. Nachdem ich einen Teil der Logik aufgeteilt, unnötige Abhängigkeiten aufgelöst und den Code umgestaltet hatte, brachte ich die Dinge endlich wieder in Ordnung.
Also, wenn Sie das nächste Mal auf einen dieser lästigen Käfer stoßen, trinken Sie einen Kaffee, lachen Sie und durchbrechen Sie den Teufelskreis!
Viel Spaß beim Debuggen! ?
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3