babel 插件语法在哪里定义?
Posted
技术标签:
【中文标题】babel 插件语法在哪里定义?【英文标题】:Where is babel plugin syntax defined? 【发布时间】:2020-07-22 02:37:01 【问题描述】:我正在构建一个 babel 插件,并且可以在 Babel repo 中找到许多已经编写好的插件示例。
我找不到用于编写此类插件的权威 API 文档——尤其是对于我可以对生成的 AST 执行的操作。
我已经检查过了
babel itself(这也是 ASTExplorer 自述文件中链接的内容 Acorn documentation 谷歌搜索“Babel 转换 API” The Babel Handbook Mozilla Parser API 和其中链接的ESTree API只是列出几个地方。它们甚至都没有定义我在现有插件中经常调用的无处不在的.get
方法,更不用说我可以在路径、节点、范围或绑定上调用的其他函数了。
Babel 7 转换是否存在明确的文档来源?如果有,在哪里?
【问题讨论】:
【参考方案1】:我不是“通天塔”专家,但几个小时后,我发现了这一点。没有关于 API 的文档,而是实际的源代码。
举个例子,我决定使用这个插件,叫做babel-plugin-transform-spread。随着我们的深入,打开这些链接。
第一站是AST Spec。在上面插件的源代码中,我看到了一些CallExpression
,可以在规范中轻松找到。根据规范,这个 Type 有几个属性(例如被调用者和参数)。我也可以在源代码中看到它们的清晰用法。目前没有什么特别的。
但你可能想问:好的,但是方法呢?
我们以ArrayExpression
为例。规范中没有方法。但是在源代码中,有很多,比如.replaceWith()
。这到底是从哪里来的?我找到了这个API doc。很老,是的,但仍然有帮助 IMO。尝试在此页面上查找replaceWith
,您会看到一些提示,例如babel-core.traverse.NodePath.prototype.replaceWith
。
好的,下一步是打开babel's GitHub page 并在babel/packages/babel-traverse
中找到有关replaceWith 的内容。这将我们引向this line。在这里你可以看到其他相关的方法。
作为练习,您可以打开 babel 手册 并尝试查找其他内容。 getPrevSibling
例如。再一次,打开 GitHub,打开搜索,查看结果,然后 here we go。或findParent
,或insertAfter
等
这种方法不是最简单的方法,但是如果没有适当的文档,这是我们必须处理的。很遗憾。
【讨论】:
你能扩展“没有关于 API 的文档...”吗?这是 Babel 团队的权威声明还是您迄今为止的发现的声明? 好点。我找到了与您的问题相关的this issue。回答“假定方法”的核心维护者说,“如果您询问 API 方法,那么是的,我们没有它们”。此外,我找不到像你一样合适的文档,不是因为他们对我们隐藏它,而是因为它不存在。否则,我认为没有任何充分的理由拥有 API 文档并将其隐藏起来。以上是关于babel 插件语法在哪里定义?的主要内容,如果未能解决你的问题,请参考以下文章
babel-preset-es2015,babel-polyfill 与 babel-plugin-transform-runtime