Sé que en la sintaxis del nuevo módulo ES6, el motor de JavaScript no tendrá que evaluar el código para conocer todas las importaciones/exportaciones, solo lo analizará y "sabrá" qué cargar.
Esto suena como izar. ¿Están izados los módulos ES6? Y si es así, ¿se cargarán todos antes de ejecutar el código?
¿Es posible este código?
import myFunc1 from 'externalModule1'; myFunc2(); if (Math.random()>0.5) { import myFunc2 from 'externalModule2'; }Después de investigar un poco más, he encontrado:
Este código no tendrá errores y funcionará:
localFunc(); import {myFunc1} from 'mymodule'; function localFunc() { // localFunc is hoisted myFunc1(); }Será un error de sintaxis . De acuerdo con esta parte de la especificación :
Module : ModuleBody ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem Significa que el módulo solo puede contener ImportDeclaration , ExportDeclaration o StatementListItem . De acuerdo con este StatementListItem no podría contener ImportDeclaration ni ExportDeclaration .
import myFunc1 from 'externalModule1';es una declaración de importación, mientras que:
if (Math.random()>0.5) { import myFunc2 from 'externalModule2'; }es una declaración. Entonces su código resultará en un error de sintaxis.
¿Qué pasa con "¿se cargarán todos antes de ejecutar el código?". Esta parte de la especificación contiene la siguiente oración:
NOTA: Antes de instanciar un módulo, todos los módulos solicitados deben estar disponibles.
Así que sí. Todos se cargarán antes de ejecutar el código .
La especificación ES6 está sujeta a cambios, pero este borrador es explícito:
La resolución de variables estáticas y el paso de enlace comprueban si hay conflictos en los nombres de las variables importadas. Si hay un conflicto entre dos nombres importados, o un nombre importado y otro enlace local, entonces es un error de tiempo de compilación.
Y tratar de importar en tiempo de ejecución es una idea dudosa, no solo en ES6. También del borrador:
La compilación resuelve y valida todas las definiciones y referencias de variables. La vinculación también ocurre en tiempo de compilación; la vinculación resuelve y valida todas las importaciones y exportaciones de módulos.
Puede ver que la implementación de ES6 de Babel no está muy contenta con ella.