Является ли "экспорт {foo по умолчанию}" действительным ES2015?

я получил выпуск на GitHub о моем плагине импорта/экспорта модуля ES2015 для ESLint, не распознающем default экспорт в следующий синтаксис:

export { 
    foo as default,
    bar
}

где мой плагин будет Линт следующее (эквивалент?) синтаксис нет проблем:

export default foo;
export const bar = ..;

и Бабель и Esprima разбирать подобный синтаксис без ошибок, и это работает для кода с использованием Babel на обоих концах (импорт и экспортный.)

однако я не убежден в spec позволяет бывшей export { x as default } форма:

для каждого IdentifierName n на ReferencedBindings of ExportClause : это синтаксическая ошибка, если StringValue n является зарезервированным словом или если StringValue n является одним из: "implements", "interface", "let", "package", "private", "protected", "public", "static" или "yield".

ReservedWord включает default, хотя я думаю, что могу поспорить, что ReferencedBindings ссыль конкретно к модулю-имена локальных идентификаторов вот такэкспорт (т. е. foo), а не само экспортируемое имя.

это также обычно кажется странным, чтобы иметь возможность экспортировать зарезервированные слова; Вавилон с радостью также позволит что-то вроде

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

Итак, вкратце: есть export { foo as default } допустимый способ экспорта значения по умолчанию в ES2015?

2 ответов


да ReferencedBindings относится только к первому IdentifierName. Так что

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

недопустимо, но

export { something as default }

нет. ESLint нужно будет исправить здесь.


Да, это действует. Я его сломаю.

  1. :

    export { foo as default }
    

    это соответствует следующим производствам (от наименее до наиболее конкретных):

    export ExportClause
    ExportClause : { ExportsList }
    ExportsList : ExportSpecifier
    ExportSpecifier : IdentifierName as IdentifierName    
    
  2. тогда у вас есть ранняя семантика ошибка:

    15.2.3.1 Статическая Семантика: Ранние Ошибки

    ExportDeclaration : export ExportClause ;

    для каждого IdentifierName n на ReferencedBindings of ExportClause : это синтаксическая ошибка если StringValue of n это ReservedWord...

    они применяются к любым производствам, соответствующим export ExportClause, включая синтаксис вашего примера. Это вызывает .

  3. на ReferencedBindings алгоритм, который применяется к этому наиболее специфическому производству, сопоставленному этому синтаксису:

    ExportSpecifier : IdentifierName as IdentifierName

    возвратить List содержащий первый IdentifierName.

Итак, вы видите, что ограничение в отношении ReservedWord и другие перечисленные значения применяются только к foo часть синтаксиса в вашем примере.