web-dev-qa-db-fra.com

Pourquoi les déclarations d'exportation / importation doivent-elles être au plus haut niveau dans es2015?

J'ai commencé à utiliser es2015 avec babel dans le dernier projet. Lorsque j'essaie de faire import ou export dans la condition if, j'ai une erreur 'import' and 'export' may only appear at the top level. Je vois beaucoup de cas pour cela et cela fonctionne bien avec require, mais pas avec les modules es2015. Y a-t-il une raison à cette limitation?

19
Alexandr Subbotin

JavaScript effectue une analyse statique sur les modules ES6. Cela signifie que vous ne pouvez pas effectuer dynamiquement des importations ou des exportations. Lire la section 4.2 de cet article pour plus d'informations :

La structure statique d'un module signifie que vous pouvez déterminer les importations et les exportations au moment de la compilation (statiquement) - vous n'avez qu'à regarder le code source, vous n'avez pas à l'exécuter.

Il existe de nombreuses raisons à cette approche, dont certaines consistent à préparer JavaScript pour de futures fonctionnalités qui reposent sur la capacité d'un fichier source à être statiquement analysable, à savoir macros et types (discuté dans l'article susmentionné).

Un autre intéressant article sur ce sujet mentionne les dépendances cycliques et les recherches rapides comme raisons.

______

Si vous souhaitez effectuer un export dans un bloc imbriqué d'un module, reconsidérez la façon dont vous écrivez le module et exposez ses API/internes car cela n'est presque certainement pas nécessaire. Il en va de même si vous êtes actuellement requireing modules dans des blocs imbriqués dans votre code ES5. Pourquoi ne pas require/import en haut de votre module et consommer leurs API/internes au sein des blocs imbriqués? Le principal avantage de cette approche, au moins du point de vue de la lisibilité, est que vous pouvez connaître les dépendances d'un module sans avoir à analyser sa source pour les appels require.

16
sdgluck