`export {foo as default}`有效的ES2015?

时间:2015-10-15 18:21:58

标签: javascript syntax language-lawyer ecmascript-6 specifications

我收到issue on GitHub关于ESLint的ES2015模块导入/导出验证插件,但未通过以下语法识别default导出:

export { 
    foo as default,
    bar
}

我的插件将lint下面的(等效?)语法没问题:

export default foo;
export const bar = ..;

BabelEsprima都解析了类似的语法而没有错误,这适用于两端使用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中导出默认值的有效方法吗?

2 个答案:

答案 0 :(得分:8)

是的,ReferencedBindings仅指第一个IdentifierName。所以

export { default as something } // or
export { default }

无效,但

export { something as default }

不是。 ESLint需要在这里修复。

答案 1 :(得分:6)

是的,它有效。我打破了它。

  1. export { foo as default }
    

    这符合以下作品(从最少到最具体):

    export ExportClause
    ExportClause : { ExportsList }
    ExportsList : ExportSpecifier
    ExportSpecifier : IdentifierName as IdentifierName    
    
  2. 然后你有early error semantics

      

    15.2.3.1静态语义:早期错误

         

    ExportDeclaration : export ExportClause ;

         

    对于IdentifierName n中的每个ReferencedBindings ExportClause:如果StringValue的{​​{1}}为{{1},则语法错误}} ...

    这些适用于与n匹配的任何作品,包括您的示例语法。这会调用ReservedWord算法。

  3. 适用于此语法匹配的最具体产品的ReferencedBindings算法是:

      

    export ExportClause

         

    返回包含第一个ReferencedBindings的{​​{1}}。

  4. 因此,您可以看到有关ExportSpecifier : IdentifierName as IdentifierName和其他列出值的限制仅适用于示例中语法的List部分。