2016-01-05 10 views
12

TL; DR: Czy istnieje sposób określania kolejności uruchamiania wtyczek Babel? W jaki sposób Babel określa tę kolejność? Czy jest jakieś sprecyzowanie, jak to działa, oprócz nurkowania w źródła Babel?Wtyczki Babel działają zgodnie z zamówieniem

Pracuję nad własną wtyczką Babel. Zauważyłem, że kiedy go uruchomię, moja wtyczka jest uruchamiana przed innymi wtyczkami es2015. Na przykład mając kodu, takich jak:

const a =() => 1 

i odwiedzającego takich jak:

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

mój plugin zauważa ArrowFunction (a nie funkcja). Grałem z rzędu, w którym wtyczki są wymienione w konfiguracji Babel, ale to niczego nie zmienia:

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

OTOH, to wygląda na to, aby NIE jakoś Dziedzina:

https://phabricator.babeljs.io/T6719

---- EDIT ----

I okazało się, że jeśli pisarz mój gość, co następuje:

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

obie funkcje są wywoływane. Wygląda więc na to, że kolejność wykonywania to: myplugin_enter -> other_plugin -> myplugin_exit. Innymi słowy, myplugin wydaje się być przed other_plugin w niektórych wewnętrznych potokach. Główne pytanie pozostaje jednak takie samo - kolejność wtyczek w potoku powinna być określona w jakiś sposób konfigurowalna.

Odpowiedz

8

Kolejność wtyczek jest zależna od kolejności rzeczy w twoim .babelrc z wtyczkami uruchomionymi przed ustawieniami, a każda grupa działa później wtyczek/ustawień wstępnych przed wcześniejszymi.

Kluczową sprawą jest jednak to, że zamawianie odbywa się według węzła AST. Każda wtyczka nie wykonuje pełnego przejścia, Babel wykonuje pojedynczą konwersję, uruchamiając wszystkie wtyczki równolegle, z każdym węzłem przetwarzanym po jednym na każdym uruchomionym programie obsługi dla każdej wtyczki.

+1

Dzięki, ale nawet przy mojej .babelrc wyłączonej i mojej "kolejce wtyczek", takiej jak 'plugins: ['transform-es2015-arrow-functions', 'path_to_myplugin']', funkcja-transform-es2015-strzałki-funkcja jest oczywiście nazywana jest funkcją wejścia AFTER myplugin. Dlaczego tak jest? Czy istnieje sposób na skonfigurowanie kolejki wtyczek w babel (oprócz radzenia sobie z ustawieniami, które nie są zbyt szczegółowym rodzajem kontroli)? –

+3

Napisałeś też "... i każdą grupę z późniejszymi wtyczkami/ustawieniami wcześniejszymi.". Czy mógłbyś wyjaśnić, co rozumiesz przez "grupę"? –

+2

Mam podobną sytuację. Czy masz inną funkcję odwiedzającego w wyższym zakresie, prawdopodobnie w 'Programie', który wywołuje' path.traverse' z rzeczywistymi odwiedzającymi? Wyobrażam sobie, że zostanie to nazwane jako pierwsze. –

3

Zasadniczo, co napisał @loganfsmyth jest poprawne; nie ma (prawdopodobnie) więcej magii w samej sobie zamawiania wtyczek.

Co do mojego problemu, moje zamieszanie spowodowane było działaniem transformacji strzałek. Nawet jeśli wtyczka babel-plugin-transform-es2015-arrow-functions koduje kod szybciej niż moją wtyczkę, nie usuwa oryginalnej funkcji strzałki ast od ast, więc nawet późniejsza wtyczka widzi to.

Uczenie się: w kontaktach z Babel nie należy lekceważyć liczby instrukcji debugowania niezbędnych do zrozumienia, co się dzieje.

Powiązane problemy