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.