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

问题描述 投票:0回答:1

这个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中吗?

它有什么不同吗?

node.js babeljs visitor babel-plugin
1个回答
2
投票

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你没有。

© www.soinside.com 2019 - 2024. All rights reserved.