7.17.0发布——正则'v'模式和...🥁装饰器!
我们刚刚发布了Babel 7.17.0!
经过多年的迭代、重写和调整,看起来装饰器方案终于又稳定在一个新的设计上了!这个版本包括解析和转换的功能。这个版本包括对新方案的解析和转换支持。
我们还实现了RegExpv 标志提案,并增加了对私有字段重构的解析支持,这两个提案目前都处于第二阶段。最后,一个新的实验性实现@babel/register 。
你可以在GitHub上阅读整个更新日志。
如果你或你的公司想支持Babel和JavaScript的发展,但不确定如何支持,你可以在我们的Open Collective或GitHub赞助商上为我们捐款,更好的是,直接与我们一起实现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依靠不同的第三方软件包来转换正则表达式:我们感谢regjsparser、regjsgen和regexpu-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 。