TL; DR:有没有办法指定Babel插件应该运行的顺序?巴别塔如何确定此订单?除了潜入巴别塔资源外,有什么规格可以解决这个问题吗?
我正在开发自己的Babel插件.我注意到,当我运行它时,我的插件在其他es2015插件之前运行.例如,具有以下代码:
const a = () => 1
和访客如:
visitor: { ArrowFunctionExpression(path) { console.log('ArrowFunction') }, FunctionExpression(path) { console.log('Function') }, }
我的插件观察ArrowFunction(而不是Function).我玩了Babel配置中列出插件的顺序,但这没有改变任何东西:
plugins: ['path_to_myplugin', 'transform-es2015-arrow-functions'], plugins: ['transform-es2015-arrow-functions', 'path_to_myplugin'],
OTOH,这看起来像命令在某种程度上重要:
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之前.然而,主要问题保持不变 - 管道中插件的顺序应该以某种方式确定和配置.
插件的顺序基于在.babelrc
预设之前运行的插件中的事物的顺序,并且每个组在之前的插件/预设之前运行插件/预设.
但关键是订购是按AST节点排序的.每个插件都不进行完全遍历,Babel执行单个遍历并行运行所有插件,每个节点一次处理一个运行每个插件的每个处理程序.