This Babel plugin:
module.exports = function(){
return {
visitor:{
Program:{
enter(){ console.log('Enter') },
exit(){ console.log('Exit') }
}
},
pre(){ console.log('Pre') },
post(){ console.log('Post') }
}
}
produces this output for any javascript file:
Pre
Enter
Exit
Post
pre()
is called right before Program.enter()
and post()
right after Program.exit()
.
If I want to run some code at the beginning/end of the AST traversal, is there any reason I should put that code inside pre
/post
instead of Program.enter
/Program.exit
?
Does it make any difference?
There's no difference AFAIK. Both are called before/after the syntax tree has been completely traversed.
The only difference would be that the parameters pass to Program.enter
/Program.exit
are different from the parameters passed to 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
},
}
}
For example, from Program.enter()
you have access to state.opts
with your plugin options, whereas from pre()
you don't.