我正在尝试编写一个简单的 babel 插件,但是我很难用嵌套的访问者遍历匹配的节点。我想require
在一个模块中找到需要某个模块的所有调用,然后在同一范围内应用一些转换。
为了用一个人为的例子来说明这一点,我想将源代码转换为:
const f = require('foo-bar');
const result = f() * 2;
变成类似的东西:
const result = 99 * 2; // as i "know" that calling f will always return 99
我试图做以下事情:
module.exports = ({ types: t }) => ({
visitor: {
CallExpression(path) {
if (path.node.callee.name === 'require'
&& path.node.arguments.length === 1
&& t.isStringLiteral(p.node.arguments[0])
&& path.node.arguments[0].value === 'foo-bar'
) {
const localIdentifier = path.parent.id.name;
// if i print here it will show me that it successfully
// found all require calls
p.scope.traverse({
Identifier(subp) {
// this will never run at all
if (subp.name === localIdentifier) {
console.log('MATCH!');
}
}
});
}
}
}
});
我的方法是否有缺陷,或者从代码的角度来看我需要做些什么不同的事情?