Babel v6:我如何/可以编写一个添加新语法(即新运算符)的插件

Babel v6: How/Can I write a plugin that adds a new syntax (ie a new operator)?

本文关键字:新语法 添加 一个 v6 语法 插件 运算符 Babel      更新时间:2023-09-26

注意:我在Babel问题跟踪器上发现了这个问题(https://phabricator.babeljs.io/T2653)它被拒绝了,但AFAIK的作者没有在这里提出要求。

我检查了Babel插件,比如包/Babel插件语法做表达式,这些ES6+新语法/运算符似乎根本没有在插件中定义,而是在巴比伦实现的,只是由这些插件打开。

在最新的博客文章中,"开发人员已经构建了从调试工具[…]到实验性新语法[…]的一切,以在他们的代码库上执行复杂的规则",这一说法令人怀疑——事实上,我搜索了整个插件生态系统,但没有发现任何插件能够提供新的运算符/语法,并且只有一个插件能够为少数现有运算符提供运算符重载。

那么,使用Babel v6,我们真的能够看到在用户区中定义新的运算符/语法吗?

这也是我感谢巴贝尔队全体队员的良好表现的机会!

附言:我开始研究如何扩展Babylon语法分析器,以便实现一个插件,该插件将像Julia方法中那样实现"模式匹配"。

从Babel v6.18.0开始,添加了parserOpts选项,允许将配置传递给解析器,即Babylon。

巴比伦接受选项plugins,该选项可用于指定要启用的插件名称列表。在撰写本文时,您只能参考巴比伦内置的插件之一。

有多种建议允许外部插件,例如

  • https://github.com/babel/babylon/pull/5
  • https://github.com/babel/babylon/pull/11
  • https://github.com/babel/babylon/issues/22

共识是~

在过去,我们一直反对允许外部扩展到巴比伦的想法。支持自定义解析要比支持自定义转换困难得多。巴贝尔已经有很多东西需要支持,所以我们不想打开这个。

–https://github.com/babel/babylon/pull/5#issuecomment-195801336

要启用自定义解析,您需要:

  • 叉子巴别塔和巴比伦;或
  • 使用https://github.com/sweet-js/sweet.js

不久前,我围绕Babel v6构建了一个瘦包装器,以启用"高级"插件(即添加新语法的插件):

https://github.com/lukehorvat/babby

Babby纯粹是一个实验,而不是你真正应该使用的东西。但它确实向您展示了对Babel/Bayylon进行的最低限度的更改,以支持OP正在讨论的插件类型。

babel插件的变换求幂运算符插件添加了一个新的运算符(**)。看起来你应该能够从他们的代码开始(这很简单)来构建你自己的、不同的运算符。

在我对babel或一般编译器如何工作的简单理解中,不可能有一个babel插件来"添加新语法"。

为了做到这一点,您必须派生babel解析器,并在那里添加您的新语法。然后,您可以使用您的自定义插件来使用分叉的自定义解析器。