2016-01-05 11 views
12

TL; DR:Babelプラグインの実行順序を指定する方法はありますか? Babelはこの注文をどのように決定しますか?バベルの情報源へのダイビングとは別にこの仕組みがどのような仕組みになっていますか?Babelプラグインが実行されます

私自身のBabelプラグインを開発しています。私はそれを実行すると、私のプラグインは他のes2015プラグインの前に実行されることに気付きました。など

const a =() => 1 

と訪問者:例のようなコードを持つために

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

私のプラグインがArrowFunction(およびない関数)を観察します。私はプラグインがバベル構成に示されている順序で再生、それは何も変更されませんでした:

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

大藤を、これは何とか問題の順序のようんになります。

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の前にあるようです。しかし、主な問題は同じです。パイプライン内のプラグインの順序は、どうにかして設定することができます。&

答えて

8

プラグインの順序がプリセットの前に実行されているプラ​​グインを使用して.babelrcで物事の順序に基づいて、各グループは、以前のものの前に、後のプラグイン/プリセットを実行しています。

重要なことは、順序はASTノードごとです。各プラグインは完全なトラバーサルを実行しません。バベルはすべてのプラグインを並列に実行する単一のトラバーサルを実行し、各ノードは各プラグインの各ハンドラーを一度に1つずつ処理します。

+1

ありがとうございます。私の.babelrcが無効になっていて、 'plugins:['transform-es2015-arrow-functions'、 'path_to_myplugin']'のような 'プラグインの順序'であっても、transform-es2015-arrow-functionsのenter関数は明らかにAFTER mypluginのenter関数と呼ばれます。なぜこれはそうですか? babelでプラグインの順序を設定する方法はありますか(プリセットを扱うことは別ですが、これは非常に細かい種類のコントロールではありません)。 –

+3

また、 '...各グループは後のプラグイン/プリセットを以前のものよりも前に実行しています。'あなたは「グループ」の意味を説明してください。 –

+2

私は似たような状況です。より高いスコープで別の訪問者機能を持っていますか、実際の訪問者と 'path.traverse'を呼び出す' Program'の可能性がありますか?私はこれが最初に呼ばれるだろうと思っています。 –

3

基本的に、@loganfsmythが書き込んだものは正しいです。プラグインの注文にはそれ以上の魔法はありません。

具体的には、私の混乱は矢印の機能変換の仕組みに起因していました。 babel-plugin-transform-es2015-arrow-functionsプラグインがプラグインよりも早くコードをマングリングしても、元の矢印機能のノードをastから削除しないので、後のプラグインでも表示されます。

学習:Babelを扱う場合、何が起きているのかを理解するために必要なデバッグプリントステートメントの量を過小評価しないでください。

関連する問題