2016-01-27 3 views
6

Ho sentito dire che le esportazioni/importazioni dinamiche non sono consentite in es6.Ciò che si qualifica come esportazione dinamica in ES6

This website Utilizza l'esempio export default 5 * 7; come se fosse un'esportazione legale e statica. Questo sembra ragionevole dal momento che valuta chiaramente il valore statico di 35, ma mi chiedo cosa si qualifica esattamente come esportazione statica ora.

This Code utilizza export default Backbone.Router.extend({...}); come se fosse legale, statico, di esportazione. Questo mi sembra pericoloso perché sembra un'esportazione dinamica (esportando il risultato di una chiamata di funzione).

risposta

5

Il secondo esempio esporta il risultato della chiamata di funzione, che è statica. La funzione viene chiamata una sola volta, quindi il risultato sarà sempre lo stesso su ogni importazione.

un esempio per illustrare:

f.js

function f() { 
    return 2 * Math.random(); 
} 

export default f(); // Is called, before the export is defined. Result: 1.23543 

i1.js

import f from 'f'; 

console.log(f); // 1.23543 

i2.js

import f from 'f'; 

console.log(f); // 1.23543 as well 
6

Tutte le esportazioni sono statici in ES6, cioè, il loro nome esportato si risolve in ex in pratica un legame variabile nel modulo di esportazione e questo può essere determinato da un singolo sguardo prima di valutare il codice del modulo.

Un modulo non può aggiungere o rimuovere dinamicamente le esportazioni tramite l'esecuzione del codice, l'elenco dei nomi esportati è fissato dalla dichiarazione.

Indipendentemente dal fatto che questa variabile mantenga una costante o il risultato di una chiamata di funzione, non importa se detiene un valore primitivo o un oggetto. Non ha nemmeno bisogno di essere una costante, il contenuto della variabile può cambiare nel tempo (vedi un esempio here).


Tutte le importazioni da import dichiarazioni sono statici come pure, il che significa che è possibile esplorare il grafico delle dipendenze senza eseguire alcun codice del modulo.

A dinamico l'importazione viene effettuata tramite una chiamata esplicita al caricatore di moduli. Tali carichi possono dipendere dal flusso di controllo del modulo e possono differire da esecuzione a corsa. Il codice deve gestire manualmente l'asincronia del processo e i potenziali errori.