TL;DR: 如何指定 Babel 插件运行的顺序?Babel 如何确定插件的顺序?除了查看 Babel 源代码,还有没有规范说明它的工作原理?
我正在开发自己的 Babel 插件。我注意到,当我运行它时,我的插件会在其他 es2015 插件之前运行。例如,有以下代码:
我正在开发自己的 Babel 插件。我注意到,当我运行它时,我的插件会在其他 es2015 插件之前运行。例如,有以下代码:
const a = () => 1
以及像访问者一样的人:
visitor: {
ArrowFunctionExpression(path) {
console.log('ArrowFunction')
},
FunctionExpression(path) {
console.log('Function')
},
}
我的插件观察的是箭头函数(而不是普通函数)。我尝试过在Babel配置中更改插件的顺序,但这并没有改变任何东西:
plugins: ['path_to_myplugin', 'transform-es2015-arrow-functions'],
plugins: ['transform-es2015-arrow-functions', 'path_to_myplugin'],
另一方面,看起来顺序确实很重要:
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之前。然而,主要问题仍然相同 - 插件在管道中的顺序应该以某种方式确定和配置。
plugins: ['transform-es2015-arrow-functions', 'path_to_myplugin']
,transform-es2015-arrow-functions的enter函数显然在myplugin的enter函数之后被调用。为什么会这样?除了处理预设(这不是非常细粒度的控制),是否有一种方法来配置babel中的插件顺序? - Tomas KulichProgram
调用path.traverse
并使用您实际的访问者?我想这会首先被调用。 - Fabian Zeindl