Javascript 如何在遍历期间从Babel节点获取字符串形式的代码

Javascript 如何在遍历期间从Babel节点获取字符串形式的代码,javascript,babeljs,abstract-syntax-tree,traversal,Javascript,Babeljs,Abstract Syntax Tree,Traversal,在下面的代码中,是否可以获取AST节点的整个字符串表示形式,在本例中,该节点将返回window.alert'asdf' 您可能正在寻找 试试这个: const { default: generate } = require('@babel/generator'); module.exports = () => ({ visitor: { Identifier: (path, state) => { console.log(genera

在下面的代码中,是否可以获取AST节点的整个字符串表示形式,在本例中,该节点将返回window.alert'asdf'


您可能正在寻找

试试这个:

const { default: generate } = require('@babel/generator');

module.exports = () => ({
    visitor: {
        Identifier: (path, state) => {
            console.log(generate(path.parent));
        },
    },
});
@babel/parser返回的每个AST节点都有一个开始和结束属性,指向它在源代码中的位置。您可以使用它们为原始字符串对源进行切片

const{parse}=require'@babel/parser'; 常量源='1+2+3'; const ast=parsesource; const node=ast.program.body[0].expression.left; console.logsource.slicenode.start,node.end;//→ '1 + 2' 有一种方法


一个问题是@babel/generator将不尊重原始代码,例如,在本例中,即使原始代码没有尾随分号,它也总是在末尾添加一个尾随分号。有没有办法得到原始代码?还是说信息在解析过程中丢失了?@NanLi,futpib的回答更正确这个回答最正确,对性能最好
const { default: generate } = require('@babel/generator');

module.exports = () => ({
    visitor: {
        Identifier: (path, state) => {
            console.log(generate(path.parent));
        },
    },
});
const ast = parse("window.alert('asdf')")

let preloadCode = ""
traverse(ast, {
  CallExpression: function(path) {
    // path.node.toString()
    path.getSource() 
  },
})