【问题标题】:Replacing different kinds of function nodes on babel替换 babel 上不同类型的函数节点
【发布时间】:2018-12-04 04:11:16
【问题描述】:

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

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

当您要处理FunctionExpressions 时,问题就来了。您可能知道,FunctionExpression 可以出现在 AST 的多个位置:

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

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

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

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

问候

【问题讨论】:

    标签: javascript babeljs babel-plugin


    【解决方案1】:

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

    这似乎是因为AssignmentExpressionVariableDeclarator 都期望Expression 作为参数。 FunctionDeclaration 不是该组的一部分(正如您在其aliases list 上看到的那样),而是FunctionExpression is。因此,即使输出代码相同,在 AST 术语中它们也不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      相关资源
      最近更新 更多