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
instancedel 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.