跳至主内容

7.17.0 发布:正则表达式 'v' 模式与……🥁 装饰器!

· 1 分钟阅读
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

我们刚刚发布了 Babel 7.17.0!

经过多年迭代、重写和调整,装饰器提案终于在新设计上重新稳定下来了!此版本包含对新提案的解析和转换支持。

我们还实现了正则表达式 v 标志提案,并添加了对解构私有字段的解析支持(两者目前均为 Stage 2)。最后,推出了全新的实验性 @babel/register 实现。

您可以在 GitHub 上查看完整更新日志。

如果您或您的公司希望支持 Babel 和 JavaScript 的发展,但不确定如何参与,可以通过我们的 Open CollectiveGitHub Sponsors 进行捐赠,更棒的是直接参与新 ECMAScript 提案的实现!作为志愿者驱动的项目,我们依赖社区支持来资助为广泛 JavaScript 用户提供帮助的工作。欢迎通过 team@babeljs.io 联系我们讨论合作!

重点更新

装饰器 (#14004, #13681)

在收集 JavaScript 开发者、引擎开发者和语言专家的反馈后,装饰器提案进行了重写以兼顾多方约束和需求。我们与现任提案作者 @pzuraq 合作,在 Babel 中实现了新的 Stage 2 提案。

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

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

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

您可以通过向 @babel/plugin-proposal-decorators 传递 "version": "2021-12" 选项启用新提案:

babel.config.json
{
"plugins": [
["@babel/plugin-proposal-decorators", {
"version": "2021-12"
}]
]
}
注意

虽然新装饰器语法与先前提案兼容,但语义存在差异:为 Babel "legacy"、Babel older-but-not-legacy 或 TypeScript 编写的装饰器将无法用于新提案。

若您希望推动提案进展,可尝试使用并在提案 GitHub 仓库中提交反馈。

正则表达式集合表示法与字符串属性 (#14125)

Babel 现已支持正则表达式集合表示法与字符串属性提案,该提案通过新的 v 标志引入三项正则表达式新特性:

  • 扩展集合表示法:支持计算字符或字符串集合的差集、交集和并集

    JavaScript
    /[\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 转义符

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

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

可通过 @babel/plugin-proposal-unicode-sets-regex 插件启用此提案:

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

Babel 依赖多个第三方包实现正则表达式转换:衷心感谢 regjsparserregjsgenregexpu-core 维护者抽空评审我们的 PR!

管道运算符的 @@^^ 主题标记 (#13973)

我们持续协助提案作者评估管道运算符提案的不同标记:提案倡导者 J. S. Choi 新增了两种可通过 topicToken 选项尝试的新标记:

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

完整支持方案请参阅 @babel/plugin-proposal-pipeline-operator 文档。

实验性 @babel/register 重构 (#13782)

我们计划将 Babel 8 发布为 ESM 包,但这带来关键挑战:如何在 CommonJS 包中同步加载运行?

多数场景可异步运行或加载 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/eslint-parser 新实现已随 Babel 7.15.0 通过 @babel/eslint-parser/experimental-worker 发布。