Der Webpack-Import gibt abhängig von der Reihenfolge der Importe undefiniert zurück

78

Ich benutze Webpack + Babel. Ich habe drei Module, die so aussehen:

// A.js

// some other imports here
console.log('A');
export default 'some-const';

// B.js

import someConst from './A';
console.log('B', someConst);
export default 'something-else';

// main.js

import someConst from './A';
import somethingElse from './B';
console.log('main', someConst);

Wenn main.jsausgeführt wird, sehe ich Folgendes:

B undefined
A
main some-const

Wenn ich die Einfuhren tauschen main.js, Bdie erste werden, erhalte ich:

A
B some-const
main some-const

Wie kommen B.jswird undefinedanstelle eines Moduls in der ersten Version? Was ist los?

Alec Mev
quelle

Antworten:

178

Nach fast einem ganzen Arbeitstag, an dem das Problem eingegrenzt wurde (AKA-Haarziehen), wurde mir endlich klar, dass ich eine zirkuläre Abhängigkeit habe.

Wo es heißt // some other imports here, Aimportiert ein anderes Modul C, das wiederum importiert B. Awird zuerst importiert main.js, ist also Bder letzte Link im "Kreis", und Webpack (oder eine CommonJS-ähnliche Umgebung wie Node) schließt es einfach kurz, indem es A's zurückgibt module.exports, was immer noch der Fall ist undefined. Schließlich wird es gleich some-const, aber der Synchroncode in Bendet mit zu tun , undefinedstatt.

Das Problem wurde behoben , indem die zirkuläre Abhängigkeit durch Verschieben des Codes, der Cvon out abhängt B, beseitigt wurde. Ich wünschte, Webpack würde mich irgendwie davor warnen.

Bearbeiten: In der letzten Anmerkung gibt es, wie von @cookie hervorgehoben, ein Plugin für die Erkennung kreisförmiger Abhängigkeiten , wenn Sie dieses Problem [erneut] vermeiden möchten .

Alec Mev
quelle
19
Es gibt ein Plugin für Webpack, das zirkuläre Abhängigkeiten erkennt
Cookie
4
Du bist ein verdammter Held. Webpack ist so ein Müllcontainerfeuer - das hat gerade meine vue.js-Seite in die Luft gesprengt. Es stellt sich heraus, dass, wenn Komponente X den Vuex-Status Y + js Modul Z importiert und Y und Z beide dieselbe JSON-DATEI importieren, dies irgendwie eine zirkuläre Abhängigkeit darstellt. Hätte es ohne dieses SO nie behoben.
Paul Gowder
3
Also ... wenn Webpack fehlerhaften Code ausgibt, weil es keine zirkulären Abhängigkeiten unterstützt (ich behaupte nicht, dass es schlechtes Design unterstützen sollte), warum brauchen wir dann ein Plugin, das uns sagt, dass wir ein Problem haben?
joonas.fi
2
@ joonas.fi: Ich stimme zu. IMO mit dem JS-Ökosystem kommt es normalerweise auf jwz.org/doc/worse-is-better.html
Johncip
Dank dir habe ich einen unmöglichen Fehler behoben, du hast mir viel Zeit gespart: - *
Wazime