2015-12-10 15 views
18

Ho iniziato a utilizzare es2015 con babel nell'ultimo progetto. Quando provo a fare import o export all'interno della condizione if, ho un errore 'import' and 'export' may only appear at the top level. Vedo un sacco di casi per questo e funziona bene con require, ma non con i moduli es2015. C'è qualche ragione per questa limitazione?Perché le dichiarazioni di esportazione/importazione devono essere al massimo livello in es2015?

+2

Perché i moduli es2015 sono caricati in modo sincrono, forse? Consentire l'esportazione nidificata significherebbe che l'esportazione può essere posticipata fino a quando tale linea non viene chiamata – CodingIntrigue

+0

babel-eslint. https://stackoverflow.com/questions/39158552/ignore-eslint-error-import-and-export-may-only-appear-at-the-top-level –

risposta

15

JavaScript esegue analisi statiche su moduli ES6. Ciò significa che non puoi eseguire dinamicamente importazioni o esportazioni. Read section 4.2 of this article for more information:

struttura di un modulo essendo mezzi statici che sia possibile determinare le importazioni e le esportazioni in fase di compilazione (staticamente) - basta guardare il codice sorgente, non è necessario eseguirlo.

ci sono molte ragioni per questo approccio, alcuni dei quali sono da preparare JavaScript per le funzionalità future che si basano sulla capacità di un file sorgente da staticamente analizzabile, vale a dire macro e tipi (discussi nel articolo di cui sopra).

Un'altra article on this topic interessante menzioni dipendenze cicliche e ricerche veloci come ragioni.

______

Se si desidera eseguire un export all'interno di qualche blocco nidificato di un modulo, riconsiderare come si sta scrivendo il modulo ed esponendo le sue API/interni in quanto non è quasi certamente necessario. Lo stesso vale se al momento si sta utilizzando i moduli require all'interno di blocchi nidificati nel codice ES5. Perché non lo require/import nella parte superiore del modulo e consumare le proprie API/intern all'interno dei blocchi nidificati? Il vantaggio principale di questo approccio, almeno dal punto di vista della leggibilità, è che è possibile conoscere le dipendenze di un modulo senza dover eseguire la scansione della sua origine per le chiamate require.

+3

Non solo, ma sono concettualmente innalzati dalle dipendenze dei moduli sono completamente elaborati prima ancora che uno qualsiasi del tuo codice venga eseguito, e il concetto di avere un'importazione in un 'if' richiederebbe l'esecuzione. – loganfsmyth

+0

@loganfsmyth Questo è un modo molto più succinto di metterlo :-) – sdgluck

Problemi correlati