【问题标题】:Why must export/import declarations be on top level in es2015?为什么在 es2015 中出口/进口申报必须在顶层?
【发布时间】:2016-03-16 04:09:25
【问题描述】:

我在上一个项目中开始使用带有 babel 的 es2015。当我尝试在if 条件内执行importexport 时,出现错误'import' and 'export' may only appear at the top level。我看到很多这样的案例,它适用于require,但不适用于 es2015 模块。这种限制有什么原因吗?

【问题讨论】:

标签: javascript babeljs ecmascript-6


【解决方案1】:

JavaScript 对 ES6 模块执行静态分析。这意味着您不能动态执行导入或导出。 Read section 4.2 of this article for more information:

模块的结构是静态的意味着您可以在编译时(静态地)确定导入和导出——您只需要查看源代码,而不必执行它。

这种方法有很多原因,其中一些是为将来依赖源文件可静态分析能力的功能准备 JavaScript,即类型(在上述文章中讨论过)。

另一个有趣的article on this topic 提到了循环依赖快速查找作为原因。

______

如果您想在模块的某个嵌套块中执行export,请重新考虑您是如何编写模块并公开其 API/内部的,因为这几乎肯定没有必要。如果您当前在 ES5 代码的嵌套块中 requireing 模块,情况也是如此。为什么不在模块顶部require / import 并在嵌套块中使用它们的 API/内部?这种方法的主要优点是,至少从可读性的角度来看,您可以了解模块的依赖关系,而无需扫描其源代码以查找 require 调用。

【讨论】:

  • 不仅如此,它们在概念上也被提升了,因为模块依赖关系在您的任何代码执行之前就已经完全处理,并且在 if 中导入的概念需要执行。
  • @loganfsmyth 这是一种更简洁的表达方式:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2015-10-15
  • 2015-12-24
  • 2019-10-09
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多