【Babel】Babel的API-@babel/traverse

933 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

@babel/traverse

@babel/traverse 用来遍历和修改由 @babel/parser 解析出来的AST,它提供了一个 traverse 方法,这个方法有两个参数:

function traverse(parent,opts)
  • 参数parent:指定要遍历的AST节点;
  • 参数opts:指定visitor函数,Babel会在遍历parent对应的AST节点的时候调用相应的visitor函数。

enter和exit

参数opts是一个对象,前面讲到的节点类型就用在这里了,opts以节点类型名称作为属性,属性的值又是一个对象,这个对象中包含 enterexit 两个方法。当进入到对应节点时调用 enter 方法,离开节点时则调用 exit 方法。

const parser = require('@babel/parser');
const traverse = require('@babel/traverse')
// 代码字符串 
const code = `
    const sayHi = () => {
        console.log('hi')
    }
`
const ast = parser.parse(code, {
    sourceType: 'unambiguous'
});

traverse.default(ast, {
    // 变量声明节点visitor
    VariableDeclaration: {
        enter(path, state) {
            console.log('变量声明enter')
        },
        exit(path, state) {
            console.log('变量声明exit')
        }
    },
    // 箭头函数表达式visitor
    ArrowFunctionExpression: {
        enter(path, state) {
            console.log('箭头函数enter')
        },
        exit(path, state) {
            console.log('箭头函数exit')
        }
    }
})

上面的代码中,变量code保存的就是我们要用与parse的代码字符串,可以看出是一个函数表达式,我们把这个代码字符串放到可视化AST中,可以看到它的结构如下:

然后使用traverse遍历AST的时候,在上面的AST中会先遍历到VariableDeclaration然后再到ArrowFunctionExpression,所以执行上面的代码则会在控制台输入如下结果:

enterexit 都有 pathstate 这两个参数,path参数记录当前节点的一些信息,比如说 path.node.type 可以获取当前AST节点的类型,