【发布时间】: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