Javascript 如何使用acorn.js或类似库向ast树添加新节点?

Javascript 如何使用acorn.js或类似库向ast树添加新节点?,javascript,abstract-syntax-tree,esprima,Javascript,Abstract Syntax Tree,Esprima,我曾尝试使用acorn.js和yeoman将代码添加到现有的js文件中。我曾尝试与esprima和acorn合作完成这项工作,但我找不到任何关于将节点添加到AST的文档。我相信这就是您正在寻找的内容。我发现将estraverse与acorn一起使用非常有用。您可以使用acorn将JS文件转换为AST,然后根据ECMAscript使用estraverse轻松添加或替换节点 您需要查找的是estraverse.replace(..)API。(虽然晚了三年,但答案如下) 您首先需要了解,不能简单地将新

我曾尝试使用acorn.js和yeoman将代码添加到现有的js文件中。我曾尝试与esprima和acorn合作完成这项工作,但我找不到任何关于将节点添加到AST的文档。

我相信这就是您正在寻找的内容。

我发现将estraverse与acorn一起使用非常有用。您可以使用acorn将JS文件转换为AST,然后根据ECMAscript使用estraverse轻松添加或替换节点

您需要查找的是estraverse.replace(..)API。

(虽然晚了三年,但答案如下)

您首先需要了解,不能简单地将新节点添加到AST树的任何位置。由于您表示要将代码添加到js文件中,因此需要将其添加到带有
主体的节点中。操作
主体的方式与处理数组的方式相同(以acorn为例)。下面是如何将节点添加到
FunctionDeclaration
节点的示例

//astNode是一个FunctionDeclaration节点,其主体包含更多节点
//newNode是要插入的代码
astNode.body.push(newNode);//在功能块末尾添加节点
astNode.body.unshift(newNode);//在功能块的开头添加节点
astNode.body.splice(索引,0,newNode);//在索引处添加节点
他说,“如果链接页面发生变化,只有链接的答案可能会失效。”。。但在这种情况下,如果回购协议被否决,那么这种解释无论如何都是无用的。耶曼文件的第二个链接仅指向回购协议,没有解释如何与耶曼一起使用。因此,答案的关键部分是与回购协议的联系。另外,原始海报没有给出足够的上下文,我需要解释如何在他的案例中使用它。所以,为什么不让原始海报可能得到问题的答案,而不是让它永远得不到答案呢。