Plugins 巴贝尔插件运行顺序

Plugins 巴贝尔插件运行顺序,plugins,transformation,babeljs,commutativity,Plugins,Transformation,Babeljs,Commutativity,TL;DR:有没有办法指定Babel插件的运行顺序?巴贝尔如何确定这个顺序?除了钻研巴别塔的资料来源之外,还有什么其他的规范吗 我正在开发自己的Babel插件。我注意到,当我运行它时,我的插件运行在其他es2015插件之前。例如,具有如下代码: const a = () => 1 及访客,例如: visitor: { ArrowFunctionExpression(path) { console.log('ArrowFunction') }, FunctionExpr

TL;DR:有没有办法指定Babel插件的运行顺序?巴贝尔如何确定这个顺序?除了钻研巴别塔的资料来源之外,还有什么其他的规范吗

我正在开发自己的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'],
OTOH,看起来顺序确实很重要:

----编辑----

我发现,如果我写我的访客如下:

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

这两个函数都被调用。看起来执行顺序是:myplugin\u enter->other\u plugin->myplugin\u exit。换句话说,在某些内部管道中,myplugin似乎比其他插件要早。然而,主要问题仍然是一样的——管道中插件的顺序应该以某种方式确定和配置。

插件的顺序是基于
中事物的顺序。babelrc
插件在预设之前运行,每组在较早的插件/预设之前运行较晚的插件/预设


但关键是排序是按AST节点。每个插件并不进行完全遍历,Babel只进行一次遍历,并行运行所有插件,每个节点一次处理一个插件的每个处理程序。

基本上,@loganfsmyth编写的内容是正确的;插件排序本身(可能)没有更多的魔力了

至于我的问题,我的困惑是由箭头函数转换的工作原理引起的。即使
babel-plugin-transform-es2015-arrow-functions
插件比我的插件更快地破坏代码,它也不会从ast中删除原来的arrow函数ast节点,因此即使是后来的插件也会看到它


学习:在处理Babel时,不要低估了解发生了什么所需的调试打印语句的数量。

谢谢,但即使禁用了my.babelrc和我的“插件顺序”,如
插件:['transform-es2015-arrow-functions','path_to_myplugin']
,transform-es2015-arrow-functions的enter函数显然是在myplugin的enter函数之后调用的。为什么会这样?有没有一种方法可以在babel中配置插件顺序(除了处理预设,这不是一种非常精细的控制)。。。并且每个组都会在较早的插件/预设之前运行较晚的插件/预设。你能解释一下你所说的“团体”是什么意思吗?我也有类似的情况。您是否在更高的范围内有另一个访问者函数,可能是针对调用路径的
程序?我想这会比@loganfsmyth先被调用-我看到插件按顺序运行。我在webpack的UglifyJs插件中遇到了非确定性错误,有时会失败,因为lambda没有转换成函数。真的很想知道XDLearning在做什么:如果你以前没有什么经验,那么在你学习的第一年或第二年(我在这里很慷慨),忘掉正常的社交生活吧。只需使用AST Explorer。