plugins - support - usebuiltins babel
Los complementos de Babel ordenan (2)
TL; DR: ¿Hay alguna manera de especificar el orden en el que se supone que se ejecutan los complementos de Babel? ¿Cómo determina Babel este orden? ¿Hay alguna especificación de cómo funciona esto además de sumergirse en las fuentes de Babel?
Estoy desarrollando mi propio plugin de Babel. Noté que cuando lo ejecuto, mi complemento se ejecuta antes que otros complementos de es2015. Por ejemplo, tener un código como:
const a = () => 1
y visitante como:
visitor: {
ArrowFunctionExpression(path) {
console.log(''ArrowFunction'')
},
FunctionExpression(path) {
console.log(''Function'')
},
}
mi complemento observa ArrowFunction (y no Function). Jugué con el orden en el que los complementos aparecen en la configuración de Babel, pero eso no cambió nada:
plugins: [''path_to_myplugin'', ''transform-es2015-arrow-functions''],
plugins: [''transform-es2015-arrow-functions'', ''path_to_myplugin''],
OTOH, parece que el orden SÍ de alguna manera importa:
https://phabricator.babeljs.io/T6719
---- EDIT ----
Descubrí que si escribo a mi visitante de la siguiente manera:
ArrowFunctionExpression: {
enter(path) {
console.log(''ArrowFunction'')
}
},
FunctionExpression: {
exit(path) {
console.log(''Function'')
}
},
ambas funciones son llamadas. Por lo tanto, parece que el orden de ejecución es: myplugin_enter -> other_plugin -> myplugin_exit. En otras palabras, myplugin parece estar antes de other_plugin en alguna canalización interna. Sin embargo, la pregunta principal sigue siendo la misma: el orden de los complementos en la tubería debería determinarse y configurarse de alguna manera.
El orden de los complementos se basa en el orden de las cosas en su .babelrc
con complementos que se ejecutan antes de los preajustes, y cada grupo ejecutando complementos / preajustes posteriores a los anteriores.
La clave es que el orden es por nodo AST. Cada complemento no realiza un recorrido completo, Babel realiza un recorrido único ejecutando todos los complementos en paralelo, con cada nodo procesado de uno en uno ejecutando cada controlador para cada complemento.
Básicamente, lo que @loganfsmyth escribió es correcto; no hay (probablemente) más magia en el plugin que se ordena a sí misma.
En cuanto a mi problema específicamente, mi confusión fue causada por cómo funciona la transformación de la función de flecha. Incluso si el babel-plugin-transform-es2015-arrow-functions
destruye el código antes que mi plugin, no elimina el nodo original de la función de flecha del ast, por lo que incluso el plugin posterior lo ve.
Aprendizaje: al tratar con Babel, no subestime la cantidad de declaraciones de impresión de depuración necesarias para comprender lo que está sucediendo.