Tom*_*ich 14 plugins transformation commutativity babeljs
TL; DR:有没有办法指定Babel插件应该运行的顺序?巴别塔如何确定此订单?除了潜入巴别塔资源外,有什么规格可以解决这个问题吗?
我正在开发自己的Babel插件.我注意到,当我运行它时,我的插件在其他es2015插件之前运行.例如,具有以下代码:
const a = () => 1
Run Code Online (Sandbox Code Playgroud)
和访客如:
visitor: {
ArrowFunctionExpression(path) {
console.log('ArrowFunction')
},
FunctionExpression(path) {
console.log('Function')
},
}
Run Code Online (Sandbox Code Playgroud)
我的插件观察ArrowFunction(而不是Function).我玩了Babel配置中列出插件的顺序,但这没有改变任何东西:
plugins: ['path_to_myplugin', 'transform-es2015-arrow-functions'],
plugins: ['transform-es2015-arrow-functions', 'path_to_myplugin'],
Run Code Online (Sandbox Code Playgroud)
OTOH,这看起来像命令在某种程度上重要:
https://phabricator.babeljs.io/T6719
----编辑----
我发现如果我把访问者写成如下:
ArrowFunctionExpression: {
enter(path) {
console.log('ArrowFunction')
}
},
FunctionExpression: {
exit(path) {
console.log('Function')
}
},
Run Code Online (Sandbox Code Playgroud)
这两个函数都被调用.因此看起来执行的顺序是:myplugin_enter - > other_plugin - > myplugin_exit.换句话说,myplugin似乎在某个内部管道中的other_plugin之前.然而,主要问题保持不变 - 管道中插件的顺序应该以某种方式确定和配置.
log*_*yth 12
插件的顺序基于在.babelrc
预设之前运行的插件中的事物的顺序,并且每个组在之前的插件/预设之前运行插件/预设.
但关键是订购是按AST节点排序的.每个插件都不进行完全遍历,Babel执行单个遍历并行运行所有插件,每个节点一次处理一个运行每个插件的每个处理程序.
基本上,@loganfsmyth 写的是正确的;插件排序本身(可能)没有更多的魔力。
至于我的问题,我的困惑是由箭头函数转换的工作原理引起的。即使babel-plugin-transform-es2015-arrow-functions
插件比我的插件更早地破坏了代码,它也不会从 ast 中删除原始的箭头函数 ast 节点,因此即使是后来的插件也会看到它。
学习:在处理 Babel 时,不要低估了解正在发生的事情所需的调试打印语句的数量。
归档时间: |
|
查看次数: |
4252 次 |
最近记录: |