2015-03-29 14 views
29

So che nella nuova sintassi del modulo ES6, il motore JavaScript non dovrà valutare il codice per sapere su tutte le importazioni/esportazioni, sarà solo parse e "sapere" cosa caricare.Le importazioni dei moduli ES6 sono state issate?

Questo suona come un sollevamento. I moduli ES6 sono sollevati? E se è così, saranno caricati tutti prima di eseguire il codice?

È possibile questo codice?

import myFunc1 from 'externalModule1'; 

myFunc2(); 

if (Math.random()>0.5) { 
    import myFunc2 from 'externalModule2'; 
} 
+3

modulo 'dichiarazioni import' sono altrettanto validi nei blocchi come dichiarazioni di funzione sono. – Bergi

risposta

18

Dopo aver fatto qualche più ricerca, ho trovato:

  • Le importazioni vengono issate! secondo il spec di ModuleDeclarationInstantiation
  • tutti i moduli dipendenti verranno caricati prima dell'esecuzione qualsiasi codice.

Questo codice avrà nessun errore, e funziona:

localFunc(); 

import {myFunc1} from 'mymodule'; 

function localFunc() { // localFunc is hoisted 
    myFunc1(); 
} 
+5

L'esempio indicato non dimostra il sollevamento dall'importazione. myFunc1 viene utilizzato solo nell'ambito sotto l'importazione. Il localFunc stesso viene issato, e questo è tutto ciò che questo esempio dimostra. – Constablebrew

+3

se la chiamata a localFunc non genera un errore quando chiama myFunc1, allora viene dimostrato che le importazioni sono state issate. – Shanimal

3

specifica ES6 è un soggetto a modifiche, ma this draft è esplicito:

La risoluzione variabile statica e collegando controlli passa per i conflitti a nomi di variabili importati. Se c'è un conflitto tra due nomi importati , o un nome importato e un altro bind locale, allora è un errore in fase di compilazione.

E provare a importare in fase di esecuzione è un'idea dubbia, non solo in ES6. Anche dalla bozza:

La compilazione risolve e convalida tutte le definizioni di variabile e i riferimenti . Il collegamento avviene anche in fase di compilazione; il collegamento risolve e convalida tutto il modulo importa ed esporta.

Si può vedere che Babel's ES6 implementation non è troppo felice con esso.

+1

Si propone tuttavia che 'System.require (" modulename ")' o così consentirà il caricamento dinamico del modulo, restituendo una promessa per il modulo. Non sarà collegato allo scopo del modulo, ovviamente. – Bergi

21

Sarà un errore SyntaxError. Secondo this part of specification:

Module : 
    ModuleBody 

ModuleBody : 
    ModuleItemList 

ModuleItemList : 
    ModuleItem 
    ModuleItemList ModuleItem 

ModuleItem : 
    ImportDeclaration 
    ExportDeclaration 
    StatementListItem 

Ciò significa che il modulo può contenere solo ImportDeclaration 's, ExportDeclaration' s o StatementListItem 's. Secondo thisStatementListItem potrebbe non contenere ImportDeclarationExportDeclaration.

import myFunc1 from 'externalModule1'; 

è una dichiarazione di importazione, mentre:

if (Math.random()>0.5) { 
    import myFunc2 from 'externalModule2'; 
} 

è una dichiarazione. Quindi il tuo codice si tradurrà in un errore di sintassi.

E a proposito di "saranno caricati tutti prima di eseguire il codice?". This part of specification contenere la prossima frase:

NOTA: Prima di creare un'istanza di un modulo, devono essere disponibili tutti i moduli richiesti.

Quindi, sì. Verranno caricati tutti prima di eseguire il codice.

+0

alexpods, grazie per averlo chiarito, ma sono riuscito a issare un'importazione senza metterla all'interno dell'istruzione "if". guarda la mia risposta – gilamran