unexpected uncaught syntaxerror from es6 another javascript node.js ecmascript-6 webpack commonjs

javascript - uncaught - En la sintaxis `import` de ES6, ¿cómo se evalúa exactamente un módulo?



require javascript (1)

Digamos que tenemos cuatro módulos, A , B , C y D

En el módulo A :

console.log("A evaluated") function AClass { console.log("A constructor") } var aObj = new AClass() export default aObj;

En el módulo B :

import aObj from A export default "B"

En el módulo C :

import aObj from A export default "C"

En el módulo D :

import b from B import c from C import aObj from A

Entonces, cuando se evalúa el módulo D , ¿cuántas veces se imprimirá el A evaluated y el A constructor en la consola?

¿Se describe este comportamiento en la norma ES6 ? ¿Qué debo hacer si quiero que un módulo se evalúe SOLAMENTE UNA VEZ sin importar cuántas veces se importe directa o indirectamente? ¿Alguien tiene alguna idea acerca de esto?


Cuando se ejecuta el módulo D , la consola imprimirá este mensaje:

A evaluated A constructor

Lo que significa que el módulo A se evaluó solo una vez, incluso si otros módulos lo importaron varias veces.

Las reglas de evaluación para los ES6 modules son las mismas que para el formato commonjs :

  • Un módulo es un fragmento de código que se ejecuta una vez que se carga. Esto significa que si un módulo no está incluido en el paquete principal, no se evaluará
  • Los módulos son singletons. Si un módulo se importa varias veces, solo existe una instance del mismo y se evalúa solo una vez durante la carga

El comportamiento de importar la misma instancia del módulo se describe en la sección HostResolveImportedModule de la especificación ECMAScript 6.
Menciona:

Esta operación ( operación de importación) debe ser idempotente si se completa normalmente. Cada vez que se llama con un módulo de referencia específico, un par de especificador (importar <a> desde <source>) como argumentos, debe devolver la misma instancia de registro de módulo.

El comportamiento de la evaluación única del módulo se describe en ModuleEvaluation , punto 4 y 5, utilizando la bandera booleana Evaluated .
Cada módulo tiene un indicador Evaluated que se asegura de evaluar el código del módulo solo una vez.