9

我收到了issue on GitHub关于我的ESLint无法识别default出口以下语法ES2015模块导入/导出验证插件:`export {foo as default}`有效的ES2015?

export { 
    foo as default, 
    bar 
} 

在我的插件将皮棉以下(等效量)语法没有问题:

export default foo; 
export const bar = ..; 

两个BabelEsprima分析没有错误类似的语法,这两端(进出口)用巴贝尔工程代码。

不过,我不相信的spec允许前export { x as default }形式:

对于每个IdentifierNamenExportClauseReferencedBindings:这是一个语法错误,如果n个的StringValue是ReservedWord或者如果的StringValue n是“implements”,“interface”,“let”,“package”,“private”,“protected”,“public”,“static”或“yield”中的一个。

ReservedWorddoes include default,但我认为人们可能认为ReferencedBindings所指specifically to the module-local identifier names正在出口(即foo),而不是导出的名称本身。

它通常也似乎是一个奇怪的事情,能够出口保留字;巴贝尔愉快地也将允许像

// ./foo.js 
export { foo as yield } 
// ./mod.js 
import { yield as nonReservedIdentifier } from './foo' 

因此,简言之:是export { foo as default }导出默认ES2015有效的方法是什么?

回答

8

是的,ReferencedBindings只引用第一个IdentifierName。所以

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

是无效的,但

export { something as default } 

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

+0

但是,在这种情况下,'default'是名为'default'的命名导出还是实际的'default'导出? –

+0

我想[进口规格](http://www.ecma-international.org/ecma-262/6.0/#sec-static-semantics-importentriesformodule)表明它是两个。 –

+0

是的,默认导出只是一个名为'default'的导出绑定。这是这么说的,除了有导出/导入默认导出的特殊语法,否则'default'是一个无效的本地标识符。 – Bergi

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 ;

    对于每个IdentifierNamenExportClauseReferencedBindings:这是一个语法错误如果nStringValueReservedWord ...

    这些适用于任何生产匹配export ExportClause,包括您的示例语法。这将调用ReferencedBindings算法。

  3. 适用于通过此语法匹配,大多数特定的生产的ReferencedBindings算法是:

    ExportSpecifier : IdentifierName as IdentifierName

    返回包含第一IdentifierName一个List

所以你看,关于ReservedWord和其他上市值的限制仅适用于在你的榜样语法的foo一部分。

相关问题