我正在编写一个Babel插件,需要操作代码文件中的每个顶级声明,即直接位于Program
节点下的每个声明。
Babel插件手册说'Do not traverse when manual lookup will do',解释说我可以简单地遍历子节点。这很好。我的问题是所有操作函数 - replaceWith
,insertBefore
,insertAfter
等 - 都是在路径上定义的,而不是在节点上定义的。所以,当我在子节点上进行迭代时,我该如何操作它们呢?
在我看来,我需要一些从给定节点获取路径对象的方法。但我只能找到相反案例的文档:从路径对象(path.node
)获取节点。
答案 0 :(得分:7)
您无法从节点获取路径,因为节点不知道它在AST中的位置。
该部分尝试制作的一点是,您应该避免在path.traverse
时调用path.get("foo")
,因此对Program
你可以做
Program(path) {
path.get("body").forEach((child) => {
// "child" here is a NodePath
});
},