7.17.0 发布:正则表达式 'v' 模式与……🥁 装饰器!
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
我们刚刚发布了 Babel 7.17.0!
经过多年迭代、重写和调整,装饰器提案终于在新设计上重新稳定下来了!此版本包含对新提案的解析和转换支持。
我们还实现了正则表达式 v 标志提案,并添加了对解构私有字段的解析支持(两者目前均为 Stage 2)。最后,推出了全新的实验性 @babel/register 实现。
您可以在 GitHub 上查看完整更新日志。
如果您或您的公司希望支持 Babel 和 JavaScript 的发展,但不确定如何参与,可以通过我们的 Open Collective 或 GitHub Sponsors 进行捐赠,更棒的是直接参与新 ECMAScript 提案的实现!作为志愿者驱动的项目,我们依赖社区支持来资助为广泛 JavaScript 用户提供帮助的工作。欢迎通过 team@babeljs.io 联系我们讨论合作!
重点更新
装饰器 (#14004, #13681)
在收集 JavaScript 开发者、引擎开发者和语言专家的反馈后,装饰器提案进行了重写以兼顾多方约束和需求。我们与现任提案作者 @pzuraq 合作,在 Babel 中实现了新的 Stage 2 提案。
新实现同时支持装饰私有类元素,以及全新的"类自动访问器"语法:
@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" 选项启用新提案:
{
"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 插件启用此提案:
{
"plugins": ["@babel/plugin-proposal-unicode-sets-regex"]
}
Babel 依赖多个第三方包实现正则表达式转换:衷心感谢 regjsparser、regjsgen 和 regexpu-core 维护者抽空评审我们的 PR!
管道运算符的 @@ 和 ^^ 主题标记 (#13973)
我们持续协助提案作者评估管道运算符提案的不同标记:提案倡导者 J. S. Choi 新增了两种可通过 topicToken 选项尝试的新标记:
{
"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 发布。