0

几天前我已经在 babel slack 频道上问过这个问题,但我一直没有得到答案。我创建了一个插件来将函数转换为 curried 函数 ( npm )。尽管我成功构建了插件,但我发现了一些解决方法,但我更愿意简化我的逻辑,从而使其更加健壮和可靠。

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

当您要处理FunctionExpressions 时,问题就来了。你可能知道,FunctionExpression一个 AST 可以出现在几个地方:

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

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

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

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

问候

4

1 回答 1

1

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

这似乎是因为AssignmentExpressionVariableDeclarator都需要一个Expressionas 参数。FunctionDeclaration不是该组的一部分(如您在其别名列表中所见),但FunctionExpression 是. 因此,即使输出代码相同,在 AST 术语中它们也不是。

于 2018-06-25T16:22:08.787 回答