pattern exports example es6 ecmascript javascript ecmascript-6 hoisting es6-modules

javascript - exports - js es6 import function



¿Se han izado las importaciones del módulo ES6? (3)

Después de investigar un poco más, he encontrado:

  • ¡Las importaciones SON izadas! de acuerdo con la spec de ModuleDeclarationInstantiation
  • 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(); }

Sé que en la nueva sintaxis del 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. ¿Se han izado 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''; }


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

La resolución de variables estáticas y la vinculación pasan comprobaciones de conflictos en nombres de variables importados. Si hay un conflicto entre dos nombres importados, o un nombre importado y otro enlace local, entonces 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 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.

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


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 solo puede contener ImportDeclaration ''s, ExportDeclaration '' s o StatementListItem ''s. De acuerdo con this StatementListItem , no podría contener la StatementListItem ImportDeclaration ni la 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 crear una instancia de un módulo, todos los módulos que solicitó deben estar disponibles.

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