当前位置: 首页 > Web前端 > HTML

一种新的JS语法是如何诞生的?

时间:2023-03-28 14:17:05 HTML

大家好,我是Kason。近日,Typescriptv5.0beta发布,主要特性是支持装饰器。有的同学会疑惑,Decorators不是一个由来已久的特性吗?各种框架(比如Nest.js、Angular)用了很久,ts早就支持了?产生这样疑惑的原因很简单,现阶段大家都在使用旧的Decorators规范,需要加上--experimentalDecorators标志才能在ts中使用。2022年3月ts的更新支持新的Decorator规范,这背后更本质的原因涉及新JS语法的诞生过程。今天,我们就以Decorators为例,谈谈一种新的JS语法是如何诞生的。欢迎加入人类优质前端交流群。飞飞的新特性是如何产生的?所有ES语法的诞生都是由国际标准组织EcmaInternational下属的TC39(第39届技术委员会)委员会负责的。这是一个会员制组织,由加入会员的公司和组织选出的代表组成。这些代表通常是JS开发者、学者,或者是编程语言领域的专家(比如大家熟悉的何老师)。360、阿里巴巴、华为、SujiTech等国内企业都参与了TC39。委员会定期召开会议,推动新ES语法的实施。这套语法登陆程序叫做TheTC39Process。值得一提的是,这个过程起源于ES2015,也就是大名鼎鼎的ES6。ES2015的整个版本已经实现了6年,它包含了大量的新特性。我想这也是为什么说到ES的新特性,很多同学首先会想到ES2015(也就是ES6)。从ES2017开始,每年都会发布一个新版本,包括那些通过了TheTC39Process而在之前的版本中没有发布的特性。TheTC39Process的整个过程包括5个阶段,阶段0到阶段4。下面简单介绍一下每个阶段的目标。Phase0:StrawpersonPhase0称为Strawperson,由TC39成员发起,通常提出新的想法或修改尚未正式收录的提案。例如,Decorator提案是YehudaKatz于2014年4月10日提出的,当该提案进行到第3阶段时,将是2022年3月。可以想象创建一个新功能有多么困难。Phase1:ProposalPhase1称为Proposal,此时提案已经成为正式提案。这个阶段主要是提出一些具体的问题和解决方案。此时,选举出一个TC39成员(通常是提案的发起者)来推动该提案。继续Decorator提案的例子,他在2015年3月24日到达了phase1,这个阶段指定了Decorator:设计目的的适用范围,比如适用于类本身:@F("color")@GclassFoo{}适用于类方法:classFoo{@F("color")@Gbar(){}}此外,它还可以适用于类访问器属性(getters、setters)、对象字面量、和对象访问器属性。在Decorator进入第一阶段一个月后,Babel跟进了Decorator的polyfill实现。这个版本的polyfill被称为legacy。我们在Babel官网上可以看到Decorator特性有5个选项:不同版本的选项对应Decorator提案不同阶段的执行时间。有不同的选择。类似的原因,ts中也支持不同版本的Decorator,这也是我们开头提到的问题的本质原因。Phase2:草案(Draft)Phase2称为草案(draft)。在这个阶段,将使用ES语法尽可能准确地描述提案的语法、语义和API,并提供一个实验性的实现。现阶段意味着该提案将大概率出现在ES的正式版中。Decorator在2016年7月28日到达Phase2,比Phase1晚了一年多。Phase3:CandidatePhase3称为Candidate。在此阶段,该提案已基本完成,仅根据外部反馈对关键问题进行了更改。ts在最新的v5.0beta版本中默认支持的Decorator是stage3。Phase4:FinishedPhase4叫做Finished。该提案将出现在正式的规范文档中,并将在下一版本的ES中得到正式支持。总结语言特性的进步是一个漫长的过程,最终达成的结果是多方博弈的结果。对于ES来说,这些游戏体现在这四个阶段。还是以Decorator为例,这个特性是oop框架(如Angular、Mobx)中非常重要的特性。Angular团队在实现Angular2时,最初考虑使用AtScript。最终Angular是用ts实现的,其中一个最重要的原因是ts团队承诺会实现一些AtScript的特性,尤其是Decorator。