EDIT : Pour plus de contexte, voir également la discussion sur ES Discuss.
J'ai trois modules A
, B
et C
. Les modules A
et B
importent l'export par défaut du module C
, et le module C
importe l'export par défaut à la fois de A
et de B
. Cependant, le module C
ne dépend pas des valeurs importées de A
et de B
lors de l'évaluation du module, seulement à un moment donné lors de l'exécution après que les trois modules aient été évalués. Les modules A
et B
dépendent de la valeur importée de C
lors de leur évaluation de module.
Le code ressemble à ceci :
// --- Module A
import C from 'C'
class A extends C {
// ...
}
export {A as default}
.
// --- Module B
import C from 'C'
class B extends C {
// ...
}
export {B as default}
.
// --- Module C
import A from 'A'
import B from 'B'
class C {
constructor() {
// cela peut s'exécuter plus tard, après que les trois modules aient été évalués, ou
// peut-être jamais.
console.log(A)
console.log(B)
}
}
export {C as default}
J'ai le point d'entrée suivant :
// --- Point d'entrée
import A from './app/A'
console.log('Point d'entrée', A)
Cependant, ce qui se passe réellement est que le module B
est évalué en premier, et il échoue avec cette erreur dans Chrome (en utilisant des classes ES6 natives, sans transpilage) :
Uncaught TypeError : Class extends value undefined is not a function or null
Cela signifie que la valeur de C
dans le module B
lors de l'évaluation du module B
est undefined
car le module C
n'a pas encore été évalué.
Vous devriez pouvoir facilement reproduire en créant ces quatre fichiers et en exécutant le fichier d'entrée.
Mes questions sont (puis-je poser deux questions concrètes ?) : Pourquoi l'ordre de chargement est-il ainsi ? Comment les modules à dépendance circulaire peuvent-ils être écrits de manière à ce que le valeur de C
lors de l'évaluation de A
et de B
ne soit pas undefined
?
(Je penserais que l'environnement des modules ES6 pourrait intelligemment découvrir qu'il devra exécuter le corps du module C
avant de pouvoir éventuellement exécuter les corps des modules A
et B
).
4 votes
Ah, j'ai voulu cette question en tant que question canonique depuis longtemps, voyons quand j'aurai le temps de répondre à tout.
0 votes
Joe, je vois que tu as posté une solution sur esdiscuss.org/topic/… mais je ne comprends pas à quoi font référence
CircularDep
etNonCircularDep
. Pour moi, tous les modules dans la question contiennent une forme de dépendances circulaires. Pourrais-tu s'il te plaît poster une réponse en termes deA
,B
,C
tels que définis dans cette question?0 votes
@Gili Hey, si tu peux répondre dans ce fil de discussion, ce serait génial. Je pense que pour ce faire, il te suffit d'envoyer un e-mail avec le même sujet.