9

Ich erhielt ein issue on GitHub über meine ES2015-Modul Import/Export-Validierung Plugin für ESLint nicht den default Export in folgenden Syntax zu erkennen:Ist `export {foo as default}` gültig für ES2015?

export { 
    foo as default, 
    bar 
} 

wo mein Plugin wird die folgenden (? Äquivalent) Fussel Syntax kein Problem:

export default foo; 
export const bar = ..; 

beide Babel und Esprima analysieren ähnliche Syntax ohne Fehler, und das funktioniert für Code Babel an beiden Enden (Import und Export).

Allerdings bin ich nicht davon überzeugt, die spec die ehemalige export { x as default } Form ermöglicht:

Für jeden IdentifierNamen in ReferencedBindings von ExportClause: Es ist ein Syntaxfehler, wenn String von n ein ReservedWord ist oder wenn der String von n ist eins von: "implements", "interface", "let", "package", "privat", "protected", "public", "static" oder "yield".

ReservedWorddoes include default, obwohl ich man könnte denken, argumentieren, dass ReferencedBindingsspecifically to the module-local identifier names bezieht, die exportiert werden (das heißt foo) und nicht der exportierte Name selbst.

Es scheint im Allgemeinen auch eine komische Sache zu sein, reservierte Wörter zu exportieren; Babel wird so etwas wie

glücklich auch
// ./foo.js 
export { foo as yield } 
// ./mod.js 
import { yield as nonReservedIdentifier } from './foo' 

So in der Zusammenfassung erlaubt: ist export { foo as default } eine gültige Weise eine Standard in ES2015 zu exportieren?

Antwort

8

Ja, ReferencedBindings bezieht sich nur auf den ersten IdentifierName. So

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

ist ungültig, aber

export { something as default } 

nicht. ESLint benötigt hier eine Korrektur.

+0

In diesem Fall ist "default" ein benannter Export namens 'default' oder der tatsächliche' default' Export? –

+0

Ich denke, die [Import Spec] (http://www.ecma-international.org/ecma-262/6.0/#sec-static-semantics-importetriesformodule) schlägt vor, dass es beides ist. –

+0

Ja, der Standard-Export ist nur eine exportierte Bindung mit dem Namen 'default'. Es ist sozusagen, abgesehen davon, dass es eine spezielle Syntax zum Exportieren/Importieren von Standardexporten gibt, und "Standard" ist andernfalls eine ungültige lokale Kennung. – Bergi

6

Ja, es ist gültig. Ich werde es aufteilen.

  1. :

    export { foo as default } 
    

    Dies entspricht den folgenden Produktionen (von gelinde spezifischsten):

    export ExportClause 
    ExportClause : { ExportsList } 
    ExportsList : ExportSpecifier 
    ExportSpecifier : IdentifierName as IdentifierName  
    
  2. Dann haben Sie die early error semantics:

    15,2. 3.1 Statische Semantik: Frühe Fehler

    ExportDeclaration : export ExportClause ;

    Für jede IdentifierNamen in ReferencedBindings von ExportClause: Es ist ein Syntaxfehler, wenn StringValue von n ein ReservedWord ist ...

    Diese gelten für alle Produktionen Passende export ExportClause, einschließlich Ihrer Beispiel-Syntax. Dies ruft den ReferencedBindings Algorithmus auf.

  3. ReferencedBindings Der Algorithmus, der durch diese Syntax abgeglichen zu dieser spezifischsten Produktion gilt, ist:

    ExportSpecifier : IdentifierName as IdentifierName

    Return a List die erste IdentifierName enthält.

Sie sehen also, dass die Beschränkung ReservedWord und die anderen aufgeführten Werte in Bezug nur auf den foo Teil der Syntax in Ihrem Beispiel angewendet wird.