是否可以创建一个改变某些功能名称的babel插件?
我似乎无法在文档中找到它。
示例:
myObject.doSomething() ==> babel ==> myObject.___doSomething()
由于
答案 0 :(得分:0)
以下是两种不同的方法(使用程序访问者或与FunctionDeclaration访问者):
export default function ({types: t}) {
return {
visitor: {
Program(path) {
path.scope.rename('doSomething', '___doSomething');
},
FunctionDeclaration(path) {
if (path.node.id.name === 'doSomething') {
path.node.id.name = '___doSomething'
}
}
}
};
}
请注意,这些不安全,因为它们可以覆盖现有名称。您可以使用path.scope.generateUidIdentifier("uid");
命令生成唯一标识符并使用它,但您无法定义生成的名称。
答案 1 :(得分:0)
您可以在astexplorer中获取代码的AST。你可以看到它是关于CallExpression和MemberExpression的。因此,在babel-types source code中搜索babel-types API,它非常清楚如何创建一个babel类型或判断像这样的babel类型:
defineType("MemberExpression", {
builder: ["object", "property", "computed"],
visitor: ["object", "property"],
aliases: ["Expression", "LVal"],
fields: {
object: {
validate: assertNodeType("Expression")
},
property: {
validate(node, key, val) {
let expectedType = node.computed ? "Expression" : "Identifier";
assertNodeType(expectedType)(node, key, val);
}
},
computed: {
default: false
}
}
});