17

TL;DR: Babel プラグインの実行順序を指定する方法はありますか? Babel はこの順序をどのように決定しますか? Babelソースに飛び込む以外に、これがどのように機能するかの仕様はありますか?

独自の Babel プラグインを開発しています。実行すると、プラグインが他の es2015 プラグインの前に実行されることに気付きました。たとえば、次のようなコードがあります。

const a = () => 1

および次のような訪問者:

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

私のプラグインはArrowFunctionを監視します(Functionではありません)。プラグインが Babel 構成にリストされている順序で遊んでみましたが、何も変わりませんでした。

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

OTOH、これは順序が何らかの形で重要であるように見えます:

https://phabricator.babeljs.io/T6719

- - 編集 - -

ビジターを次のように書くと、次のことがわかりました。

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

両方の関数が呼び出されます。したがって、実行の順序は、myplugin_enter -> other_plugin -> myplugin_exit のようになります。つまり、myplugin は内部パイプラインで other_plugin の前にあるようです。ただし、主な質問は同じままです。パイプライン内のプラグインの順序は、何らかの方法で決定および構成可能にする必要があります。

4

2 に答える 2

7

基本的に、@loganfsmyth が書いたことは正しいです。プラグインの順序付け自体には、(おそらく) もう魔法はありません。

特に私の問題に関しては、矢印関数の変換がどのように機能するかによって混乱が生じました。プラグインが私のプラグインよりも早くコードを壊したとしてもbabel-plugin-transform-es2015-arrow-functions、元のアロー関数 ast ノードを ast から削除しないので、後のプラグインでもそれを見ることができます。

学習: Babel を扱うときは、何が起こっているのかを理解するために必要な debug print ステートメントの量を過小評価しないでください。

于 2016-02-28T14:29:01.937 に答える