这个Babel插件:
module.exports = function(){
return {
visitor:{
Program:{
enter(){ console.log('Enter') },
exit(){ console.log('Exit') }
}
},
pre(){ console.log('Pre') },
post(){ console.log('Post') }
}
}
为任何javascript文件生成此输出:
Pre
Enter
Exit
Post
在pre()
之后,Program.enter()
在post()
和Program.exit()
之前被称为pre
。
如果我想在AST遍历的开头/结尾运行一些代码,有什么理由我应该将该代码放在post
/ Program.enter
而不是Program.exit
/ Program.enter
中吗?
它有什么不同吗?
AFAIK没什么区别。两者都在语法树完全遍历之前/之后调用。
唯一的区别是传递给Program.exit
/ pre
的参数与传递给post
/ module.exports = function(){
return {
visitor:{
Program:{
enter(path, state){
//path.node
//path.parent
//state.opts
},
}
},
pre(state){
//state.scope
//state.scope.globals
//state.scope.plugins
},
}
}
的参数不同。
Program.enter()
例如,从state.opts
你可以使用你的插件选项访问pre()
,而从qazxswpoi你没有。