Javascript 为什么出口/进口申报必须在es2015中处于最高水平?
在上一个项目中,我开始使用es2015和babel。当我尝试在Javascript 为什么出口/进口申报必须在es2015中处于最高水平?,javascript,babeljs,ecmascript-6,Javascript,Babeljs,Ecmascript 6,在上一个项目中,我开始使用es2015和babel。当我尝试在if条件内执行导入或导出时,我出现了一个错误“导入”和“导出”可能只出现在顶层。我看到很多这样的情况,它在require中运行良好,但在es2015模块中却不起作用。这种限制有什么原因吗?JavaScript对ES6模块执行静态分析。这意味着您无法动态执行导入或导出: 模块的结构是静态的,这意味着您可以在编译时(静态地)确定导入和导出—您只需查看源代码,而不必执行它 采用这种方法有很多原因,其中一些原因是为将来的特性准备JavaScr
if
条件内执行导入
或导出
时,我出现了一个错误“导入”和“导出”可能只出现在顶层
。我看到很多这样的情况,它在require
中运行良好,但在es2015模块中却不起作用。这种限制有什么原因吗?JavaScript对ES6模块执行静态分析。这意味着您无法动态执行导入或导出:
模块的结构是静态的,这意味着您可以在编译时(静态地)确定导入和导出—您只需查看源代码,而不必执行它
采用这种方法有很多原因,其中一些原因是为将来的特性准备JavaScript,这些特性依赖于源文件的静态分析能力,即宏和类型(在前面的文章中讨论)
另一个有趣的原因是循环依赖和快速查找
______
如果您想在模块的某个嵌套块内执行
导出
,请重新考虑如何编写模块并公开其API/内部,因为这几乎肯定不是必需的。如果您当前需要在ES5代码的嵌套块中设置模块,则情况也是如此。为什么不在模块顶部导入,并在嵌套块中使用它们的API/内部构件?至少从可读性的角度来看,这种方法的主要优点是,您可以知道模块的依赖关系,而无需扫描其源代码以查找require
调用。因为es2015模块是同步加载的?允许嵌套的导出
s意味着导出可能会推迟到该行被称为dbabel eslint时。不仅如此,它们在概念上是被提升的,因为模块依赖关系在任何代码执行之前都已被完全处理,而在if
中导入的概念将需要执行。@loganfsmyth这是一种更简洁的表达方式:-)