В чем разница между "Visitor.Program.enter ()" и "pre ()" в плагине Babel? - PullRequest
0 голосов
/ 18 октября 2018

Этот плагин 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().

Если я хочу запустить некоторый код в начале / конце обхода AST, есть ли причина, по которой я должен поместить этот код в pre / post вместо Program.enter / Program.exit?

Имеет ли это какое-то значение?

1 Ответ

0 голосов
/ 04 апреля 2019

Нет разницы AFAIK.Оба вызываются до / после полного обхода синтаксического дерева.

Единственное отличие состоит в том, что параметры, передаваемые в Program.enter / Program.exit, отличаются от параметров, передаваемых в pre / * 1006.*.

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() у вас нет.

...