web-dev-qa-db-fra.com

Quel est l'ordre d'exécution défini des importations ES6?

J'ai essayé de rechercher sur Internet l'ordre d'exécution des modules importés. Par exemple, disons que j'ai le code suivant:

import "one"
import "two"
console.log("three");

one.js et two.js sont définis comme suit:

// one.js
console.log("one");

// two.js
console.log("two");

La sortie de la console est-elle garantie:

one
two
three

Ou est-ce indéfini?

32
Max

Les modules ES6 importés sont exécutés de manière asynchrone . Cependant, toutes les importations sont exécutées avant que le script n'effectue l'importation. Cela rend les modules ES6 différents de, par exemple, modules Node.js ou balises <script> sans l'attribut async. Les modules ES6 sont plus proches de spécification AMD en ce qui concerne le chargement. Pour plus de détails, voir section 16.6.1 of Exploring ES6 by Axel Rauschmayer.

Ainsi, dans l'exemple que vous fournissez ci-dessus, l'ordre d'exécution ne peut pas être garanti. Il y a deux résultats possibles. Vous pourriez voir ceci:

one
two
three

Ou vous pourriez voir ceci:

two
one
three

En d'autres termes, les deux modules importés pouvaient exécuter leurs appels console.log() dans n'importe quel ordre; ils sont asynchrones l'un par rapport à l'autre . Mais ils seront certainement exécutés avant le script qui les importe, donc "three" Est garanti d'être enregistré en dernier.

Cela dit, aucun navigateur moderne n'implémente de modules ES6 . Je ne sais pas si des transpilers tels que Babel suivent la spécification d'origine à cet égard.

Mettre à jour

À la lumière @ BenjaminGruenbaum's commentaires ci-dessous, j'ai décidé d'examiner cela de plus près. Malgré la source ci-dessus, je ne pouvais pas trouver clairement indiqué dans la spécification elle-même que le chargement du module est asynchrone (bien que, certes, en tant que locuteur natif anglais, je trouve la spécification un peu difficile à lire). Si tel est le cas, l'ordre dans lequel les importations sont exécutées dépendra de l'implémentation. Cela dit, la même conclusion vaut: vous ne pouvez pas compter sur l'exécution de vos importations dans un ordre particulier .

24
McMath