Webpack import renvoie undefined, en fonction de l'ordre des importations

J'utilise webpack + babel. J'ai trois modules ressemblant à ceci:

// 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);

Lorsque main.js est exécuté, je vois ce qui suit:

B undefined
A
main some-const

Si j'échange les importations dans main.js, B devenir le premier, je reçois:

A
B some-const
main some-const

Comment B.js devient undefined au lieu d'un module dans la première version? Quel est le problème?

44
demandé sur loganfsmyth 2016-02-06 14:57:50

1 réponses

Après presque une journée de travail complète de réduire le problème (aka hair-pulling), j'ai finalement réalisé que j'ai une dépendance circulaire.

Où il est dit // some other imports here, A importe un autre module C, qui, à son tour, importe B. {[1] } est importé en premier dans main.js, donc B finit par être le dernier lien dans le "cercle", et Webpack (ou tout environnement de type CommonJS, d'ailleurs, comme Node) le court-circuite en retournant A module.exports, qui est toujours undefined. Finalement, il devient égal à some-const, mais le code synchrone dans B finit par traiter avec undefined à la place.

Éliminant la dépendance circulaire, en déplaçant le code C dépend de B, a résolu le problème. Wish Webpack serait en quelque sorte me prévenir à ce sujet.

Edit: sur la dernière note, comme indiqué par @ cookie, Il y a un plugin pour la détection de dépendance circulaire , si vous souhaitez éviter de heurter ce problème [à nouveau].

111
répondu Olegs Jeremejevs 2016-09-08 18:24:55