Get*_*ree 2 visitor-pattern node.js babeljs babel-plugin
这个 Babel 插件:
module.exports = function(){
return {
visitor:{
Program:{
enter(){ console.log('Enter') },
exit(){ console.log('Exit') }
}
},
pre(){ console.log('Pre') },
post(){ console.log('Post') }
}
}
Run Code Online (Sandbox Code Playgroud)
为任何 javascript 文件生成以下输出:
Pre
Enter
Exit
Post
Run Code Online (Sandbox Code Playgroud)
pre()
Program.enter()
在 之前和post()
之后调用Program.exit()
。
如果我想在 AST 遍历的开始/结束时运行一些代码,有什么理由我应该将该代码放在pre
/post
而不是Program.enter
/中Program.exit
?
有什么区别吗?
AFAIK 没有什么区别。两者都在语法树完全遍历之前/之后调用。
唯一的区别是传递给Program.enter
/ 的参数与传递给/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
},
}
}
Run Code Online (Sandbox Code Playgroud)
例如,Program.enter()
您可以访问state.opts
您的插件选项,而pre()
您则不能。
归档时间: |
|
查看次数: |
1755 次 |
最近记录: |