替换 babel 上不同类型的函数节点



几天前我已经在 babel 松弛频道上问过这个问题,但我从未得到答案。 我创建了一个插件来将函数转换为柯里函数 (npm(。尽管我成功地构建了插件,但我还是遇到了一些问题,我找到了解决方法,但我更愿意简化我的逻辑,从而使它更加健壮和可靠。

我的第一个方法是为FunctionDeclaration建立一个访客。这非常简单:将每个参数展开为一个ArrowFunctionExpression,然后将当前节点替换为返回这些函数的新FunctionDeclaration

当您想处理FunctionExpression时,问题就来了。您可能知道,FunctionExpression可以出现在多个地方,例如 AST:

  • 作为变量声明的一部分
  • 作为AssignmentExpression的一部分
  • 作为传递给另一个函数的匿名函数

所有这些都是有效的函数表达式,这带来了一个问题:我用函数声明替换了当前节点,但似乎 babel 拒绝用functionDeclaration替换任何一个节点。这迫使我通过重新创建来替换整个父节点。 到目前为止,这适用于包含 functionExpression 的赋值表达式和变量声明,但我必须完全重新创建它们才能不破坏任何代码。当您想要支持更多方案时,这变得更加困难。

对我来说,理想的情况是只替换当前节点,根本不担心它在哪里,但正如我所说,babel 拒绝在变量声明中替换当前节点。

代码可以在这里看到。注意:我不确定我是否也应该在这里发布代码,似乎没有必要

问候

最后我得出了一个解决方案。 我的第一次尝试失败了,因为我试图用FunctionDeclaration替换FunctionExpression,babel 拒绝了它,因为它似乎不兼容,即使输出代码完全相同。 在替换函数表达式时,使用函数表达式构造函数构建新的主体函数允许我只制作node.replaceWith而不是用新节点替换整个父节点。

这似乎是因为 AssignmentExpression 和 VariableDeclarator 都需要一个Expression作为参数。FunctionDeclaration不属于该组(如其别名列表所示(,但 FunctionExpression 是。因此,即使输出代码相同,在 AST 术语中它们也不是。

最新更新