Babel 插件中的“Visitor.Program.enter()”和“pre()”有什么区别?

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

有什么区别吗?

HrW*_*HrW 5

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()您则不能。