Babel Visitor遍历时修改节点属性导致递归重复处理怎么办?
我在用Babel的Visitor写AST转换时遇到个奇怪问题:当我在enter方法里修改某个节点属性后,子节点会被重复访问两次。比如处理这个按钮点击事件:
<button onclick="handleClick()">Click me</button>
<script>
function handleClick() {
console.log('clicked');
}
</script>
我原本想把onclick改为自定义事件,但在CallExpression节点修改属性后,发现visitor会先处理原属性再处理新属性。试过用node.replaceWith()和手动赋值都没解决,控制台还报”Maximum call stack size exceeded”错误。该怎么正确修改节点同时阻止重复遍历呢?
用WeakSet存访问过的节点最省事,自动垃圾回收不用自己清理。别再傻乎乎地去改Babel的遍历逻辑了,太麻烦。