¿Se elevan las importaciones de módulos ES6?


Sé que en la nueva sintaxis del módulo ES6, el motor JavaScript no tendrá que evaluar el código para conocer todas las importaciones/exportaciones, solo lo analizará y "sabrá" qué cargar.

Esto suena como ho. ¿Los módulos ES6 están izados? 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';
}
Author: Michał Perłakowski, 2015-03-29

3 answers

Será un SyntaxError. 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 puede contener solo ImportDeclaration's, ExportDeclaration's o StatementListItem's. Según este StatementListItem podría no contiene 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. Así que 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 crear una instancia de un módulo, todos los módulos solicitados deben estar disponibles.

Así que, sí. Todos se cargarán antes de ejecutar el código.

 22
Author: alexpods,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-31 16:37:00

Después de hacer un poco más de investigación, he encontrado:

  • LAS importaciones SE elevan! de acuerdo con el spec de Declaración modulainstanciación
  • TODOS los módulos dependientes se cargarán antes de ejecutar cualquier código.

Este código no tendrá errores, y funcionará:

localFunc();

import {myFunc1} from 'mymodule';

function localFunc() { // localFunc is hoisted
    myFunc1();
}
 19
Author: gilamran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-06 05:52:07

La especificación ES6 está sujeta a cambios, pero este borrador es explícito:

La variable estática resolution and linking pasa comprobaciones de conflictos en nombres de variables importadas. Si hay un conflicto entre dos nombres importados, o un nombre importado y otro enlace local, entonces se es un error en 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 de variables y referencia. 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.

Puedes ver que La implementación ES6 de Babel no está muy contenta con ella.

 3
Author: estus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-29 14:16:03