Плагины Babel запускают заказ

TL; DR: Есть ли способ указать порядок, в котором предполагается запустить плагины Babel? Как Бабель определяет этот порядок? Есть ли какая-либо специфика, как это работает помимо погружений в источники Бабеля?

Я разрабатываю свой собственный плагин Babel. Я заметил, что когда я запускаю его, мой плагин запускается перед другими плагинами es2015. Например, с кодом, например:

const a = () => 1

и посетитель, например:

visitor: {
  ArrowFunctionExpression(path) {
    console.log('ArrowFunction')
  },
  FunctionExpression(path) {
    console.log('Function')
  },
}

мой плагин отмечает ArrowFunction (а не функцию). Я играл с порядком, в котором плагины перечислены в настройке Babel, но это ничего не изменило:

plugins: ['path_to_myplugin', 'transform-es2015-arrow-functions'],
plugins: ['transform-es2015-arrow-functions', 'path_to_myplugin'],

OTOH, это похоже на порядок. Как-то важно:

https://phabricator.babeljs.io/T6719

---- EDIT ----

Я узнал, что, если я напишу своего посетителя, как показано ниже:

  ArrowFunctionExpression: {
    enter(path) {
      console.log('ArrowFunction')
    }
  },
  FunctionExpression: {
    exit(path) {
      console.log('Function')
    }
  },

вызываются обе функции. Так выглядит порядок выполнения: myplugin_enter → other_plugin → myplugin_exit. Другими словами, myplugin, кажется, до other_plugin в каком-то внутреннем конвейере. Основной вопрос, однако, остается прежним - порядок плагинов в конвейере должен определяться и конфигурироваться каким-то образом.

Ответы

Ответ 1

Порядок плагинов основан на порядке вещей в вашем .babelrc с плагинами, запущенными до пресетов, и каждая группа запускает более поздние плагины/пресеты перед предыдущими.

Главное, однако, что порядок соответствует AST Node. Каждый плагин не делает полного обхода, Babel делает один обход, который запускает все плагины параллельно, причем каждый node обрабатывается по одному за каждым обработчиком для каждого плагина.

Ответ 2

В принципе, что написал @loganfsmyth, правильно; есть (возможно) больше не волшебство в самом заказе плагина.

Что касается моей проблемы, моя путаница была вызвана тем, как работает функция преобразования функции стрелки. Даже если плагин babel-plugin-transform-es2015-arrow-functions управляет кодом раньше, чем мой плагин, он не удаляет исходную стрелочную функцию ast node с астра, поэтому даже более поздний плагин видит ее.

Изучение: когда вы имеете дело с Вавилоном, не стоит недооценивать количество отладочных заявлений печати, необходимых для понимания того, что происходит.