babel-preset-stage-0、babel-preset-stage-1 等有啥区别?
Posted
技术标签:
【中文标题】babel-preset-stage-0、babel-preset-stage-1 等有啥区别?【英文标题】:What's the difference between babel-preset-stage-0, babel-preset-stage-1 etc?babel-preset-stage-0、babel-preset-stage-1 等有什么区别? 【发布时间】:2016-09-12 02:28:43 【问题描述】:我的问题是:babel-preset-stage-0
,babel-preset-stage-1
,babel-preset-stage-2
和babel-preset-stage-3
有什么区别,我们用ES6
开发时最好的选择是什么?
【问题讨论】:
【参考方案1】:这是理解的最佳起点。 What are babel presets
链接摘录:
第 0 阶段 - Strawman:只是一个想法,可能是 Babel 插件。 第 1 阶段 - 提案:这是值得努力的。 第 2 阶段 - 草案:初始规范。 第 3 阶段 - 候选:完整的规范和初始浏览器实现。 第 4 阶段 - 完成:将添加到下一个年度版本中
全图:
-
随着时间的推移,javascript 不断发展,越来越多的功能被添加到该语言中。
浏览器还必须做很多工作才能实现这些新功能以被他们理解。这个过程通常比 Javascript 的发展速度要慢得多。
但开发人员希望使用语言的新功能,因为它使他们更容易编写、理解和维护代码。
因此,开发人员使用新的 Javascript 功能编写代码,但在该代码到达浏览器之前,它会经过一个构建过程,其中使用一些魔法,所有具有新功能的代码都被转换为浏览器可以理解的代码。即 Javascript 的新功能,但使用浏览器可理解的语言结构进行编码。
可以使用工具执行构建魔法,其中之一就是 Babel。
Babel 的工作方式是它需要一组插件。这些插件中的每一个都可以指将 JavaScript 的特定新功能转换为浏览器可理解的语言结构。
有数百个这样的插件,每一个都指代 Javascript 的不同新特性。这些功能可能会或可能不会成为最终 Javascript 规范的一部分。如果它永远不会成为最终的 Javascript 规范,那么任何浏览器都不会实现此功能。因此,如果任何开发人员使用 babel 插件使用 JS 的任何实验性功能,则他/她正在承担风险。如果它永远不会在规范中结束,那么这部分代码在部署到浏览器之前总是必须被转译。
此风险分为不同级别,表示任何功能达到最终规范的可能性。
babel 还把这些插件分成了不同的集合,在 babel 的术语中称为
preset
。每个预设都包含来自不同风险级别的插件。
preset-0
这意味着它具有非常实验性的功能插件,因此很有可能使其成为最终规范。就像开发人员想到 Javascript 应该具有特定功能一样,他做了一些工作以使其进入 TC-39 提案流程。
preset-1
它包含 TC-39 接受的功能想法的插件,他们认为值得继续努力。
preset-2
为功能准备好初始草稿的功能插件。
它还在继续……
因此,第 0 阶段中的某个功能可能会在一段时间后到达第 2 阶段,并最终在一段时间后出现在 Javascript 的下一个版本中。
因此,对于这些 Babel 预设的每个版本,您都可以在其中找到不同的插件集。也可能发生在阶段 0 中的某个功能经历了一些更改,并对它的功能进行了重大更改。它达到了,可以说是使用完全不同的 API 的第 2 阶段。因此,开发人员必须确保在更新这些插件时对代码进行必要的更改。
【讨论】:
【参考方案2】:原来的问题是“babel-preset-stage-0,babel-preset-stage-1,babel-preset-stage-2 和 babel-preset-stage-3 有什么区别”,答案很奇怪关于“TC39 stage-0,stage-1.. terminology 之间的差异”获得投票,而唯一相关的(虽然不准确)被否决。引用 babel 网站:
Babel 预设是一个可共享的插件列表。
官方 Babel Stage 预设跟踪了 TC39 暂存过程 JavaScript 中的新语法建议。
每个预设(例如 stage-3、stage-2 等)都包含所有插件 那个特定的阶段和它上面的那些。例如,第 2 阶段 包括第 3 阶段,依此类推。
核心思想是“它之上的那些”。我不回答后半部分,因为上面的答案在那部分非常好。
【讨论】:
【参考方案3】:正如其他答案所阐述的那样。第 4 阶段最稳定,第 0 阶段最危险。以下是先前答案和文档中 5 个阶段的高级别细分。我之所以添加这个,是因为当我谈到这个时,我期待对每个阶段进行更高级的分解:
第 4 阶段:完成
已准备好纳入 ECMAScript 标准,已通过测试并将成为下一个修订版的一部分
第 3 阶段:候选人
包含完整的规范文本,并包含大部分经过测试并提供反馈的插件。解决方案已完成,所有进一步的更改都基于实施经验。
第 2 阶段:草稿
尽可能完成对插件的进一步支持。对这些要求的满足大多只在途中进行增量更改。语义和 api 预计将完成。它很可能会成为规范的一部分。
第 1 阶段:提案 已发现并选择在此阶段进行检查的概念主要是 poly-fills 和演示。
第 0 阶段:稻草人 这个名字让我笑了,根据 TC-39,它没有任何类型的限制,但考虑到上下文,它是尚未选择跟进或检查的概念的类别。
每个级别都是包容性的,而 4 包括 3 包括 2 等等......我希望这个总结对未来的人有所帮助。
【讨论】:
【参考方案4】:这些阶段代表 TC39 流程定义的阶段,该流程将功能从疯狂但有用的想法转化为公认的标准,例如 ES6。这个过程需要一些时间,因为必须讨论、考虑、测试、填充、讨论每个角落案例,等等。也就是说,它是一个标准机构。目标是说“ES6”将具有完整和完整的含义,就像说“ES5”一样。
在实践中,您的项目要求的范围可能从保持久经考验的真实到使用非常方便但模糊不清的语言功能。您可能想从这些链接开始:
The TC39 Process Overview:这包括一个漂亮的图表,说明阶段的含义以及功能如何从一个阶段进展到另一个阶段。下面是 TC39 的概述。
The Active Proposals:快速概览某些提案所处的阶段。它还包括指向已完成、非活动和第 0 阶段提案的链接。今天,即 2017 年 4 月,Public Class Fields 处于第 2 阶段,这意味着它已被准确描述并已指定审阅者,但尚未全面审阅。
The Babel Preset Package for Stage 3:插件页面,包含所有第 3 阶段提案的 Git 和 NPM 链接。基本上,这个插件会引入包集合,这些包在理论上可以填充 TC39 阶段 3 中的当前提案。在实践中,可能会出现错误。此外,您还可以找到类似的,它链接到Stage 2 及以下的插件页面。这些页面将链接到包含第 3 阶段提案和不太稳定的提案的软件包。
Babel Preset 'env':此 Babel 预设支持已完成的提案,在已知环境中选择支持这些功能所需的正确包。例如,与旧版浏览器相比,本地 node
可执行文件需要更少的插件。可以认为是支持已获批准的未来功能的“stage-4”插件。
总而言之,如果您使用这些预发布功能,您只需要处理它们。如果您确实需要使用它们,请选择具有您需要的最大数量的阶段。如果您只是想要一个具有疯狂功能的玩具装置来围绕水冷却器进行讨论,请继续抢第 0 阶段。
【讨论】:
谢谢,所以 babel-env 是一种 babel-recommanded-configuration【参考方案5】:Babel 的阶段预设等同于 TC39 Process 以及每个提案的不同状态,以用于潜在的语言更改。它们包括该阶段所有提议更改的实现和 polyfill。
Stage-0
中当前的任何内容都是 Strawman,不是 ES6。它是未来的 Javascript,绝对不确定它是否会成为任何官方 ECMAScript 规范。
请不要只设置为stage-0
,这样它就可以在不了解后果的情况下工作。
只包含 ES6 特性的 Babel Preset 是preset-es2015
【讨论】:
stage-1
怎么样?使用安全吗?将来是否可以弃用某些 stage-1
功能并更改 API?
@notgiorgi 比stage-0
更安全,但绝不完全安全,不会发生变化甚至完全弃用(参见Call constructor proposal,它在第一阶段后被撤回)。但是对于除第 4 阶段(即已完成)以外的任何阶段都可以这样说。
如果运行 Node 6 或更高版本,这些天您可能希望将 preset-es2015
替换为 babel-preset-node6
。
或者更好的是,babel-preset-env
可以针对任何环境!
Guyz 请使用babel-preset-env
而不是babel-preset-es2015
.babel-preset-es2015
几乎已经过时了以上是关于babel-preset-stage-0、babel-preset-stage-1 等有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章