Skip to main content

7.3.0 Released: Named capturing groups, private instance accessors and smart pipelines

· 6 min read

继 80 次提交以后,最新的小版本 Babel 呈上!

此版本包括对正则表达式中的命名捕获组(named capturing group),私有实例访问器(private instance accessor),智能管道运算符(smart pipeline operator)以及对 TypeScript 解析相关等一系列的改进支持。你可以在 GitHub 上阅读整个更新日志(changelog)。

感谢 @jamesgeorge007@armano2 以及他们的首次 PR!

Bloomberg 正为 Babel 中新 class 功能的实现提供支持:在给我们提供了静态私有字段(static private fields)私有实例方法(private instance methods)后,他们又相继实现了实例的 getter 和 setter 方法。

另一个好消息是 AMP 项目,它将对 Babel 的赞助增加到 $24k/年,成为核心赞助商。

如果你或你的公司想要支持 Babel 和 JavaScript 的发展,但不知如何做,你可以通过 OpenCollective 向我们捐款,更好的一种选择是直接与我们合作实现新的 ECMAScript 提案!作为一个志愿者驱动的项目,我们依靠社区的支持来资助我们的工作,以帮助大部分的 JavaScript 用户并获得代码的所有权。

私有实例访问器(getter 和 setter)(#9101

JavaScript
class Person {
#firstname = "Babel";
#lastname = "JS";

get #name() {
return this.#firstname + " " + this.#lastname;
}

sayHi() {
alert(`Hi, ${this.#name}!`);
}
}

感谢 Tim (Bloomberg) 实现了该提案!

如果你还未在 Babel 7.2.0 中添加它,你可以通过在配置文件中添加 @babel/plugin-proposal-private-methods 来测试该功能,或者你可以在 repl 启用 stage-3 preset 在线测试该功能。

Class private features support is almost complete!

Class PrivateInstanceStatic
Fields
class A { #a = 1}
7.0.07.1.0
Methods
class A { #a() {} }
7.2.0
Accessors
class A { get #a() {} }
7.3.0

智能管道操作符(#9179

Babel 实现了该提案的多种形式,以帮助 TC39 测试并收集社区的反馈建议。与所有提案一样,预计在未来会发生变化。

Babel 7.2.0 中增加了对 智能管道操作符(smart pipeline operator) 提案解析的支持。感谢 Thiago Arrais 所作的工作,你现在可以将其转换为标准的 ECMAScript 并试用它!

我们目前仅支持主要提案,暂不支持其他任何额外功能。另外,我们还不支持管道中使用 yieldawait

JavaScript
name
|> # || throw new TypeError()
|> doubleSay(#, ', ')
|> capitalize
|> # + '!'
|> new User.Message(#)
|> stream.write(#, { sync: true })
|> console.log;

你可以在你的项目中使用 @babel/plugin-proposal-pipeline-operator 插件并启用 proposal: "smart" 选项,来使用该提案:

babel.config.json
{
"plugins": [
["@babel/plugin-proposal-pipeline-operator", { "proposal": "smart" }]
]
}

在这之前,Babel 通过 #6335 在 [v7.0.0-beta.3] 中添加了一个"简易"版本提案的实现。

命名捕获组(named capturing group)(#7105

JavaScript
let stringRe = /(?<quote>"|')(?<contents>.*?)\k<quote>/;

let { contents } = `"foo bar"`.match(stringRe);

Babel 中 ECMAScript 2018 功能缺失最大的部分就是该功能!在这之前,Dmitry Soshnikov 为社区提供了很棒的插件 babel-plugin-transform-modern-regexp 可以获得对命名组部分功能的支持。我们还与 code-js 进行了协调工作,为新的 @babel/plugin-transform-named-capturing-groups-regex package 提供全面支持。

@babel/preset-env 也已经更新,引入了该 package,因此,当使用它时并不需要做任何改动!

注意,运行时功能(即:groups 属性)仅适用于对 ES6 正则表达式正确支持的浏览器。如果您需在旧的环境中支持,可以在 RegExp 的方法中引入 polyfill。

TypeScript 更新 (#9302#9309

感谢 Armano@babel/parser 中的工作以及 Henry/Brian@babel/generator 中的工作(回顾直播),我们现在支持了 let x: typeof import('./x');,此功能添加于 TypeScript 2.9 中。同时还支持了 TypeScript 3.2 中添加的 bigint 类型关键字。

babel-eslint v11.0.0-beta.0: Automatic Syntax Detection by Reading Config (babel/babel-eslint#711)

感谢 Kai (负责 TSC 的 ESLint 维护) 完成这项工作!

到目前为止,babel-eslint 已手动启用所有语法插件(列表经常过时)。它还意味着它可以解析 Babel 本身配置的实例,在编译时不允许的语法。我们现在要去 @babel/core 作为 peerDependency ,并假设在使用 babel-eslint 时使用 Babel 配置,并使用相同的配置来修改自身(使其成为一个重大的变化)。这种改变有望使维护模块本身更易于管理,并重新使用 Babel 配置,这是用户使用 babel-eslint 的合理假设。

你可以通过检查此测试版是否适用于您的项目来帮助我们 🙂


Discuss on Twitter