为什么出口/进口申报必须在2015年达到顶级水平?

时间:2015-12-10 13:36:26

标签: javascript ecmascript-6 babeljs es2015

我在上一个项目中开始使用es2015和babel。当我在import条件内尝试exportif时,我遇到错误'import' and 'export' may only appear at the top level。我看到了很多这样的情况,它适用于require,但不适用于es2015模块。这种限制有什么理由吗?

1 个答案:

答案 0 :(得分:16)

JavaScript在ES6模块上执行静态分析。这意味着您无法动态执行导入或导出。 Read section 4.2 of this article for more information

  

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

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

另一个有趣的article on this topic提及循环依赖快速查找作为理由。

______

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