我開始在上一個項目中使用es2015和babel。當我嘗試在if
條件內執行import
或export
條件時,我有一個錯誤'import' and 'export' may only appear at the top level
。我看到很多這方面的案例,它適用於require
,但不適用於es2015模塊。這種限制是否有任何理由?爲什麼在es2015中必須將導出/導入聲明置於頂層?
回答
JavaScript對ES6模塊執行靜態分析。這意味着您不能動態執行導入或導出。 Read section 4.2 of this article for more information:
模塊的結構是,你可以決定在編譯時(靜態),進口和出口的靜態方法 - 你只需要看看源代碼,您不必執行它。
有很多原因的辦法,其中一些準備的JavaScript對於依賴於對源文件的能力,未來的功能是靜態可分析的,即宏和類型(在討論上述文章)。
另一個有趣的article on this topic提到循環依賴和快速查找的原因。
______
如果你想一個模塊的一些嵌套塊中執行export
,重新考慮你如何編寫模塊和揭露它的API /內部,因爲它幾乎可以肯定是沒有必要的。如果您目前在您的ES5代碼中嵌套塊中嵌入模塊require
,也是如此。爲什麼require
/import
位於模塊頂部,在嵌套塊內消耗它們的API /內部?至少從可讀性的角度來看,這種方法的主要優點是您可以知道模塊的相關性,而無需掃描require
調用的來源。
不僅如此,而且它們在模塊依賴關係之後在概念上被提升在甚至執行任何代碼之前都會被完全處理,並且在'if'中導入的概念需要執行。 – loganfsmyth
@loganfsmyth這是一個更簡潔的方式:-) – sdgluck
- 1. 爲什麼你必須在ES2015中指定導出的類型(let,var,const ...)?
- 2. 爲什麼必須導入內部類?
- 3. 爲什麼我必須聲明var = Class.new?
- 4. 文件導入/導出:什麼層?
- 5. 爲什麼必須將SharedModule導入到根模塊?
- 6. 爲什麼我明確地必須在這裏聲明函數?
- 7. 必須聲明?
- 8. 爲什麼Groovy Eclipse的Organize導入將包聲明置於導入下方,使我的文件無法編譯?
- 9. 爲什麼jsp中的EL函數必須聲明爲靜態?
- 10. 爲什麼我必須在導入NgModule時使用AlertModule.forRoot()?
- 11. 什麼是從WSO2身份服務器導入/導出聲明設置
- 12. cvGetMinMaxHistValues需要什麼導入聲明?
- 13. 當我已經導入java.util。*時,爲什麼我必須導入java.util.List?
- 14. 「導入」和「導出」可能只出現在頂層
- 15. 導入聲明
- 16. 爲什麼原型必須在構造函數之外聲明?
- 17. 爲什麼我應該在頂層聲明枚舉?
- 18. C#擅長於SQL數據庫導入(必須聲明標量變量「@SICILNO」。)
- 19. 在JavaScript ES2015擴展類中,我必須重新導入所有依賴項嗎?
- 20. hil_message必須聲明
- 21. 爲什麼我必須導入java.awt。*和java.awt.event。*(例如)
- 22. 爲什麼我必須導入我的委託頭文件?
- 23. 我必須爲SpringMVC3.2單元測試導入什麼?
- 24. 爲什麼我必須寫兩次這個導入語句?
- 25. 爲什麼我必須導入「圖像/顏色」和「圖像」?
- 26. 必須在需要之前從模塊'Darwin.POSIX.sys.xattr'中導入'setxattr'聲明
- 27. Python3:超出頂層的相對導入
- 28. 爲什麼我必須從標準庫中導入某些東西,如datetime等,但不必導入print(),len()等...?
- 29. 爲什麼MySQL導入比導出慢?
- 30. 什麼可能導致這一點必須明白元素
因爲es2015模塊是同步加載的嗎?允許嵌套的「輸出」意味着輸出可以被推遲到該行被稱爲 – CodingIntrigue
babel-eslint。 https://stackoverflow.com/questions/39158552/ignore-eslint-error-import-and-export-may-only-appear-at-the-top-level –