2015-12-10 99 views
18

我開始在上一個項目中使用es2015和babel。當我嘗試在if條件內執行importexport條件時,我有一個錯誤'import' and 'export' may only appear at the top level。我看到很多這方面的案例,它適用於require,但不適用於es2015模塊。這種限制是否有任何理由?爲什麼在es2015中必須將導出/導入聲明置於頂層?

+2

因爲es2015模塊是同步加載的嗎?允許嵌套的「輸出」意味着輸出可以被推遲到該行被稱爲 – CodingIntrigue

+0

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

回答

15

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調用的來源。

+3

不僅如此,而且它們在模塊依賴關係之後在概念上被提升在甚至執行任何代碼之前都會被完全處理,並且在'if'中導入的概念需要執行。 – loganfsmyth

+0

@loganfsmyth這是一個更簡潔的方式:-) – sdgluck

相關問題