我收到issue on GitHub关于ESLint的ES2015模块导入/导出验证插件,但未通过以下语法识别default
导出:
export {
foo as default,
bar
}
我的插件将lint下面的(等效?)语法没问题:
export default foo;
export const bar = ..;
Babel和Esprima都解析了类似的语法而没有错误,这适用于两端使用Babel的代码(导入和导出)。
但是,我不相信spec允许以前的export { x as default }
形式:
对于
IdentifierName
n
中的每个ReferencedBindings
ExportClause
:如果n的StringValue是ReservedWord,或者n的StringValue是以下值之一,则为语法错误: "实现","接口","让","包","私有","保护& #34;," public"," static",或" yield"。
ReservedWord
does include default
,虽然我认为有人可能会说ReferencedBindings
指的是导出的specifically to the module-local identifier names (即{{1} })而不是导出的名称本身。
能够导出保留字通常看起来很奇怪; Babel很乐意也允许像
这样的东西foo
因此,总结一下:// ./foo.js
export { foo as yield }
// ./mod.js
import { yield as nonReservedIdentifier } from './foo'
是在ES2015中导出默认值的有效方法吗?
答案 0 :(得分:8)
是的,ReferencedBindings仅指第一个IdentifierName。所以
export { default as something } // or
export { default }
无效,但
export { something as default }
不是。 ESLint需要在这里修复。
答案 1 :(得分:6)
是的,它有效。我打破了它。
export { foo as default }
这符合以下作品(从最少到最具体):
export ExportClause
ExportClause : { ExportsList }
ExportsList : ExportSpecifier
ExportSpecifier : IdentifierName as IdentifierName
15.2.3.1静态语义:早期错误
ExportDeclaration : export ExportClause ;
对于
IdentifierName
n
中的每个ReferencedBindings
ExportClause
:如果StringValue
的{{1}}为{{1},则语法错误}} ...
这些适用于与n
匹配的任何作品,包括您的示例语法。这会调用ReservedWord
算法。
适用于此语法匹配的最具体产品的ReferencedBindings
算法是:
export ExportClause
返回包含第一个
ReferencedBindings
的{{1}}。
因此,您可以看到有关ExportSpecifier : IdentifierName as IdentifierName
和其他列出值的限制仅适用于示例中语法的List
部分。