2016-04-12 27 views
14

Diciamo che abbiamo quattro moduli, A, B, C e DNella sintassi `import` di ES6, come viene valutato esattamente un modulo?

Nel modulo A:

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

nel modulo B:

import aObj from A 
export default "B" 

nel modulo C:

import aObj from A 
export default "C" 

Nel modulo D:

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

Così, quando il modulo viene valutata D, quante volte sarà il A evaluated e A constructor essere stampato nella console?

Questo comportamento è descritto in standard ES6? Cosa devo fare se voglio che un modulo venga valutato SOLO UNA VOLTA indipendentemente da quante volte viene importato direttamente o indirettamente? Qualcuno ha qualche idea su questo?

+1

Solo dicendo, non devi esportare le istanze, devi sempre esportare la classe - o se hai solo bisogno di oggetti, non dovresti usare le classi. – Bergi

+0

@Bergi Grazie, ma cosa devo fare se ho bisogno di un'istanza globale singleton globale in moduli diversi ... Forse l'esportazione delle istanze è l'unico modo .. –

+0

Puoi usare semplici letterali oggetto per creare singoletti. Non c'è bisogno di 'class'es. – Bergi

risposta

13

Quando viene eseguito il modulo D, la console stamperà questo messaggio:

A evaluated 
A constructor 

Il che significa che il modulo A è stata valutata solo una volta, anche se è stato importato più volte da altri moduli.

Le regole di valutazione per ES6 modules è lo stesso per il formato commonjs:

  • Un modulo è un pezzo di codice che viene eseguito una volta che è stato caricato. Significa che se un modulo non è incluso nel pacchetto principale, non verrà valutato
  • I moduli sono singleton. Se un modulo viene importato più volte, solo un singolo instance di esiste e viene valutata solo una volta al carico

Il comportamento importare stessa istanza del modulo è descritto HostResolveImportedModule sezione della Specifica ECMAScript 6.
Esso menziona:

Questa operazione (operazione di importazione) deve essere idempotente se si completa normalmente. Ogni volta stato chiamato con un referencingModule specifico, coppia specificatore (import <un> da <fonte>) come argomenti deve restituire la stessa istanza modulo Record.

Il comportamento di singola valutazione del tempo del modulo è descritto in ModuleEvaluation, punto 4 e 5 utilizzando Evaluated flag booleano.
Ogni modulo ha il flag Evaluated che si assicura di valutare il codice del modulo una sola volta.