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?
risposta
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
.
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
@loganfsmyth Questo è un modo molto più succinto di metterlo :-) – sdgluck
- 1. Perché le dichiarazioni che seguono le condizioni delle strutture di controllo devono essere in un blocco?
- 2. Le annotazioni a livello del metodo di sicurezza a molla devono essere applicate al livello controller o al livello servizio?
- 3. Le classi del livello di servizio devono essere singleton?
- 4. Le dichiarazioni preparate devono essere deallocate quando vengono utilizzate all'interno di stored procedure?
- 5. Quale livello si blocca? A che livello devono essere attivi?
- 6. Le dichiarazioni parziali non devono specificare diverse classi di base
- 7. Le variabili membro di un'interfaccia devono essere definitive ... Perché?
- 8. Le date di copyright devono essere aggiornate?
- 9. Le istanze dell'oggetto modello django devono essere passate al sedano?
- 10. Le unità di misura devono essere localizzate?
- 11. Le eccezioni devono essere classi del caso?
- 12. Gestori di eventi di dominio: devono essere utilizzati per i problemi relativi al livello di applicazione?
- 13. devono essere conformi al protocollo NSObject?
- 14. Perché le operazioni UIKit devono essere eseguite sul thread principale?
- 15. Perché ANSI_NULLS e ANSI_WARNINGS devono essere impostati su on per le query server collegate in PHP?
- 16. Perché i metodi parziali devono essere annullati?
- 17. perché le variabili 128 bit devono essere allineate al limite 16Byte
- 18. Perché i tipi WinRT devono essere sigillati?
- 19. Perché i documenti indicano che le animazioni CALayer devono essere nei blocchi di animazione di UIView?
- 20. Perché i bean Java devono essere serializzabili?
- 21. In VSCode durante l'esportazione delle funzioni: "Dichiarazioni individuali devono essere tutte esportate o tutte locali"
- 22. Le regole aziendali devono essere applicate sia nel livello applicazione che nel livello database o solo in uno dei due?
- 23. Le proprietà iniettate devono essere smaltite?
- 24. Le classi del modello devono essere testate?
- 25. Le trame OpenGL devono essere girate?
- 26. Le email di forza non devono essere raggruppate in conversazioni
- 27. Perché i componenti in reazione devono essere in maiuscolo?
- 28. Perché gli oggetti lanciati devono essere inizializzati in copia?
- 29. oracolo: quali istruzioni devono essere confermate?
- 30. Perché le viste di SQL Server devono essere aggiornate di tanto in tanto
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
babel-eslint. https://stackoverflow.com/questions/39158552/ignore-eslint-error-import-and-export-may-only-appear-at-the-top-level –