7.17.0发布——正则'v'模式和...🥁装饰器!

304 阅读4分钟

7.17.0发布——正则'v'模式和...🥁装饰器!

我们刚刚发布了Babel 7.17.0!

经过多年的迭代、重写和调整,看起来装饰器方案终于又稳定在一个新的设计上了!这个版本包括解析和转换的功能。这个版本包括对新方案的解析和转换支持。

我们还实现了RegExpv 标志提案,并增加了对私有字段重构的解析支持,这两个提案目前都处于第二阶段。最后,一个新的实验性实现@babel/register

你可以在GitHub上阅读整个更新日志。

如果你或你的公司想支持Babel和JavaScript的发展,但不确定如何支持,你可以在我们的Open CollectiveGitHub赞助商上为我们捐款,更好的是,直接与我们一起实现ECMAScript的新提案作为一个志愿者驱动的项目,我们依靠社区的支持来资助我们支持广大的JavaScript用户。如果你想讨论更多,请联系team@babeljs.io!

亮点

装饰器(#14004,#13681)

在收到JavaScript开发者、引擎开发者和语言专家的反馈后,装饰器提案被重写,以考虑到多种限制和愿望。我们与当前提案的作者@pzuraq合作,在Babel中实现新的第二阶段提案。

新的实现也支持装饰私有类元素,以及新的 "类自动访问器 "语法:

@defineElement("button")
class Button {
  @reactive accessor enabled = true; // class auto accessors

  @event("onClick") #handleClick() { // decorator on a private method
    console.log("clicked!");
  }
}

你可以通过将"version": "2021-12" 选项传递给 @babel/plugin-proposal-decorators:

{
  "plugins": [
    ["@babel/plugin-proposal-decorators", {
        "version": "2021-12"
    }]
  ]
}

⚠️虽然新的装饰器语法与之前的提案兼容,但语义不同:已经为Babel*"legacy"、Babelolder-but-not-legacy*或TypeScript编写的装饰器将不能用于新的提案。

如果你想帮助推动该提案,你可以尝试使用它,并在他们的GitHub仓库中留下反馈。

正则集符号和字符串的属性

Babel现在支持正则表达式集合符号和字符串的属性提案,它在一个新的v 标志后面引入了三个新的正则表达式功能。

  • 扩展的集合符号,允许计算字符或字符串集合的差异、相交和联合

    /[\p{Decimal_Number}--[0-9]]/v; // Non-ASCII decimal digits
    /[\p{ASCII}&&\p{Letter}]/v; // ASCII letters
    /[[\p{ASCII}&&\p{Letter}]\p{Number}]/v; // ASCII letters, or any digit
    
  • 字符串的属性,允许使用\p 转义的多节点属性

    "Did you see the 👩🏿‍❤️‍💋‍👩🏾 emoji?".match(/\p{RGI_Emoji}/v). // ["👩🏿‍❤️‍💋‍👩🏾"]
    
  • 集合中的多节点字符串,使用一个新的\q 转义

    /[\r\n\q{\r\n|NEWLINE}]/v; // Matches \r, \n, \r\n or NEWLINE
    

你可以通过以下方式启用这个提议 @babel/plugin-proposal-unicode-sets-regex插件。

{
  "plugins": ["@babel/plugin-proposal-unicode-sets-regex"]
}

Babel依靠不同的第三方软件包来转换正则表达式:我们感谢regjsparserregjsgenregexpu-core的维护者,他们花时间审查了我们的拉动请求!

@@ 和 主题标记的Hack式管道^^

我们正在继续帮助提案作者评估管道操作者提案的不同标记:冠军之一的J. S. Choi增加了对两个新标记的支持,你可以用topicToken 选项来尝试。

{
  "plugins": [
    ["@babel/plugin-proposal-pipeline-operator", {
      "proposal": "hack",
      "topicToken": "^^" // or "@@"
    }]
  ]
}

你可以在文档中阅读更多关于支持的变化。 @babel/plugin-proposal-pipeline-operatordocs中了解更多支持的变化。

实验性@babel/register

我们计划将Babel 8作为一个ESM包发布。然而,这带来了一个大问题:如何在CommonJS包中同步加载和运行它?

通常,大多数Babel消费者可以异步运行Babel,或者至少是异步加载它。但这并不适用于 @babel/eslint-parser(它将Babel的分析器与ESLint整合在一起)和 @babel/register(可用于实时转译Node.js文件),我们需要将解析和转换转移到一个单独的worker。

Babel 7.16.0在@babel/register/experimental-worker 公开了新的实验性@babel/register 实现:它在内部异步运行Babel,所以它与.mjs 配置文件.mjs Babel插件兼容。它将在Babel 8中被默认启用,您已经可以用它来替代@babel/register ,但有一些注意事项:

  • 如果您以编程方式指定@babel/register 选项(使用require("@babel/register")({ /* ... options */ }) ),您必须确保它们是可序列化的。这意味着你不能传递内联定义的插件函数,但你必须将它们移到一个单独的./my-plugin.js 文件或babel.config.js 文件中。
  • 新的实现仍然是实验性的:它应该具有与现有实现相同的功能,但有一些改进是我们正在探索的。

我们已经在Babel 7.15.0中发布了新的实验性的@babel/eslint-parser 实现,在@babel/eslint-parser/experimental-worker