2021年8月,我在美团实习期间,有幸在中科院聆听了贺师俊老师关于 TC39 提案的讲解。因此决定结合 Babel 写一篇文章来记录和分享这些内容。
Babel 是一个流行的 JavaScript 编译器,允许开发者在不等待浏览器支持的情况下使用最新的 JavaScript 特性。Babel 的一个关键功能是处理不同成熟度阶段的实验性 JavaScript 特性。在这篇博客中,我们将探讨 Babel Stage、它们的工作原理以及它们对 JavaScript 开发者的重要性。
什么是 Babel Stage?
Babel Stage 指的是 JavaScript 提案的不同成熟度级别。负责 JavaScript 语言演进的 TC39 委员会使用一个分阶段的过程来跟踪新语言特性的进展。总共有五个阶段,从 Stage 0(草案)到 Stage 4(完成)。每个阶段代表了不同的稳定性和成熟度,以便纳入官方的 JavaScript 规范(ECMAScript)。
Stage解释
-
Stage 0: 草案
- 这是新想法的初始阶段。处于这个阶段的提案是实验性的,可能会发生重大变化或被完全放弃。它们尚未被考虑纳入 ECMAScript 标准。
- 例子:开发者或 TC39 成员有一个新特性的想法,并撰写提案以开始讨论。
-
Stage 1: 提案
- 在这个阶段,提案被正式提交给 TC39 委员会。目标是收集反馈并确定这个想法是否值得继续。处于 Stage 1 的提案仍然是实验性的,但有了更明确的方向。
- 例子:可选链(
?.)的提案在首次引入时处于 Stage 1。
-
Stage 2: 草案
- Stage 2 的提案更加完善,并有了正式的规范。这个特性被考虑纳入 ECMAScript 标准,但可能仍会发生重大变化。
- 例子:
BigInt提案在有了正式规范但仍在完善时处于 Stage 2。
-
Stage 3: 候选
- 在这个阶段,提案被认为是稳定的并准备实施。规范基本完成,预计会纳入下一个 ECMAScript 版本。只会有小的改动。
- 例子:空值合并运算符(
??)在被认为稳定并准备实施时处于 Stage 3。
-
Stage 4: 完成
- Stage 4 的提案已经最终定稿并纳入 ECMAScript 标准。这个特性现在是官方 JavaScript 语言的一部分,可以在不依赖实验工具的情况下使用。
- 例子:
async/await特性达到了 Stage 4,并成为 ECMAScript 2017 的一部分。
Babel 如何处理这些阶段
Babel 允许开发者通过提供插件和预设来使用不同阶段的特性。这些插件使得使用尚未成为官方 JavaScript 规范的实验性特性成为可能。Babel 的预设(如 @babel/preset-env)可以配置为包含特定阶段的提案。
使用 Babel 预设和插件
要在 Babel 中使用特定阶段的特性,可以安装相应的预设或插件。例如,要使用 Stage 3 的特性,可以安装 @babel/preset-stage-3 预设:
npm install --save-dev @babel/preset-stage-3
然后,在你的 .babelrc 文件中配置 Babel 使用该预设:
{
"presets": ["@babel/preset-stage-3"]
}
或者,你可以安装特定特性的单个插件:
npm install --save-dev @babel/plugin-proposal-optional-chaining
并配置 Babel 使用该插件:
{
"plugins": ["@babel/plugin-proposal-optional-chaining"]
}
为什么理解 Babel Stage 很重要
理解 Babel Stage 对 JavaScript 开发者很重要,因为它允许我们:
- 走在前沿:使用实验性特性编写现代且高效的代码,利用最新的语言改进。
- 提供反馈:在早期阶段使用新特性,向 TC39 委员会提供反馈,帮助塑造 JavaScript 的未来。
- 为未来做准备:熟悉即将到来的特性,确保开发者在它们成为官方标准时能够迅速采用。