如何用babel插件替换函数名称

时间:2016-05-21 17:17:42

标签: babeljs

是否可以创建一个改变某些功能名称的babel插件?

我似乎无法在文档中找到它。

示例:

myObject.doSomething() ==> babel ==> myObject.___doSomething()

由于

2 个答案:

答案 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");命令生成唯一标识符并使​​用它,但您无法定义生成的名称。

示例 - http://astexplorer.net/#/o5NsNwV46z/1

答案 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
    }
  }
});