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的参数不同。prepost
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 次 |
| 最近记录: |