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一部分。

相關問題