最近一周比较忙,一直忙着搭建开发平台。之前不就刚用Golang搭建了一个服务端开发平台。完成之后,就需要针对Golang开发的服务开发一个管理平台,用Golang也能做,但是感觉还是麻烦,最后决定使用Node.js。
这次搭建的平台倾向于使用比较新的一些Node.js特性,例如ES6、async/await解决回调地狱等。之前用过Node.js,但是属于浅尝辄止,这次准备充分了解一下。因此有了这些学习笔记。
概述
Node.js这几年可以说是如日中天,使用Javascript这种传统意义上的前端开发语言进行后端开发,开发效率成倍提升:省去了编译、发布的过程,开发中服务器重启再也不像Java那么笨重耗时,修改之后秒起的感觉爽得不要不要的。
Node.js的运行效率也还不错,虽然不能和Java、Golang之类的比较,但是对付负载、并发量不大的管理系统还是绰绰有余。因此个人感觉在后台管理系统中使用Node.js正是上佳之选。
本篇主要是Javascript的一些基本知识。来源自网上不同的地方,也有自己写的一些心得。
名词解释
使用Node.js的时候会碰到很多新名词,这里整理了以下经常见到的东西。对概念有个明确的了解有助于之后的学习。
ECMA
Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字。
ECMAScript
就是Javascript的国际标准。Javascript发布以来出现了很多变种,例如Netscape的Javascript、Microsoft的JScript等等。后来通过ECMA组织重新进行了标准化,形成了ECMAScript。
所以说ECMAScript就是JavaScript语言的正式名称。自从Sun公司宣布拥有JavaScript这个名字之后,商标上出现冲突,所以对JavaScript拥有认证权利的ECMA委员会强制改成这个名字。
历次版本
- ECMAScript 1 1997年6月,首版;
- ECMAScript 2 1998年6月,格式修正,以使得其形式与ISO/IEC16262国际标准一致;
- ECMAScript 3 1999年12月 强大的正则表达式,更好的文字链处理,新的控制指令,异常处理,错误定义更加明确,数输出的格式化及其它改变;
- ECMAScript 4 未完成…可能更明确的类的定义,命名空间等等…
- ECMAScript 5 2009年12月发布。2004年6月欧洲计算机制造商协会发表了ECMA-357标准,它是ECMAScript的一个扩延,它也被称为E4X(ECMAScript for XML)。
- ECMAScript 2015 2015年6月17日发布。截止发布日期,JavaScript的官方名称是ECMAScript 2015,Ecma国际意在更频繁地发布包含小规模增量更新的新版本,下一版本将于2016年发布,命名为ECMAScript 2016。从现在开始,新版本将按照ECMAScript+年份的形式发布。
ES6
ES6就是ES2015。
ES2016、ES2017
从ES5 2009-ES6 2015经历了6年,语言的变化比较大。为了避免剧烈的变动,从ES7 2016开始,版本发布会变得更加频繁,每次的变动也更小。每年会发布一个新版本,其中包含所有已经完成的特性。所以之后对应的版本就是ES2016、ES2017。。。每一版本都包含一些新增的特性。
ES6目前的兼容情况
Javascript是一门活的语言,最近几年一直在更新。因此很多特性并不是所有环境都已经支持,包括Node.js、浏览器,会有很多特性并不支持。
对于Node.js兼容情况,可以通过网站 Node green: es2015 support status 查看。浏览器兼容情况可以通过网站 es2015 compatibility status 查看。
为了在项目中使用ES6的特性,对于后端开发,可以选择新版本的Node.js或者使用Babel进行编译;对于前端来说,Babel是唯一的选择。
TC39 Process
TC39
TC39(Technical Committee 39)是一个推动JavaScript发展的委员会,受特许解决JavaScript语言相关事宜。它的成员由各个主流浏览器厂商的代表构成。会议的每一项决议必须大部分人赞同,并且没有人强烈反对才可以通过。因为,对成员来说,同意就意味着有责任去实现它。
每一项新特性,要最终纳入ECMAScript规范中,TC39拟定了一个处理过程,称为TC39 process。其中共包含5个阶段,Stage 0 ~ Stage 4。
Stage 0: strawman
一种推进ECMAScript发展的自由形式,任何TC39成员,或者注册为TC39贡献者的会员,都可以提交。
Stage 1: proposal
该阶段产生一个正式的提案。 (1)确定一个带头人来负责该提案,带头人或者联合带头人必须是TC39的成员。 (2)描述清楚要解决的问题,解决方案中必须包含例子,API以及关于相关的语义和算法。 (3)潜在问题也应该指出来,例如与其他特性的关系,实现它所面临的挑战。 (4)polyfill和demo也是必要的。
Stage 2: draft
草案是规范的第一个版本,与最终标准中包含的特性不会有太大差别。 草案之后,原则上只接受增量修改。 (1)草案中包含新增特性语法和语义的,尽可能的完善的形式说明,允许包含一些待办事项或者占位符。 (2)必须包含2个实验性的具体实现,其中一个可以是用转译器实现的,例如Babel。
Stage 3: candidate
候选阶段,获得具体实现和用户的反馈。 此后,只有在实现和使用过程中出现了重大问题才会修改。 (1)规范文档必须是完整的,评审人和ECMAScript的编辑要在规范上签字。 (2)至少要有两个符合规范的具体实现。
Stage 4: finished
已经准备就绪,该特性会出现在年度发布的规范之中。 (1)通过Test 262的验收测试。 (2)有2个通过测试的实现,以获取使用过程中的重要实践经验。 (3)ECMAScript的编辑必须规范上的签字。
按照上述的流程,一个特性从Stage 0走到Stage 4就算正式发布了。正式发布的特性将被加入到当年的版本中,例如变成ES2017或者ES2018的新特性。
Babel
Babel是一个转换编译器,它能将ES6转换成可以在浏览器中运行的代码。Babel由来自澳大利亚的开发者Sebastian McKenzie创建。他的目标是使Babel可以处理ES6的所有新语法,并为它内置了React JSX扩展及Flow类型注解支持。
据codemix创始人Charles Pick介绍,Babel是所有ES6转换编译器中与ES6规范兼容度最高的,甚至超过了谷歌创建已久的Traceur编译器。Babel允许开发者使用ES6的所有新特性,而且不会影响与老版本浏览器的兼容性。此外,它还支持许多不同的构建&测试系统,使开发者很容易将它集成到自己的工具链中。 Charles认为,Babel从根本上讲是一个平台,这是它与compile-to-JS语言CoffeeScript和TypeScript最大的不同。Babel的插件系统允许开发者自定义代码转换器并插入到编译过程。这些转换器会接收一棵抽象语法树,并在代码转换成可执行的JavaScript之前对其进行操作。codemix已经尝试开发了静态&运行时类型检查、闭包消除、JavaScript“健康宏(hygienic macros)”等插件。 Babel不仅跟踪ES6的进展情况,而且还是ES7或ES2016的试验场。比如,它已经支持async/await, 使开发者更容易编写异步JavaScript代码,而且与使用回调或Promises相比,代码更简洁易懂。虽然主流浏览器可能还需要几年的时间才能支持 这种异步JavaScript代码编写方式,但Babel使开发者现在就可以用上它。这得益于Babel与JavaScript技术委员会(TC39)保持着高度一致,能够在ECMAScript新特性标准化之前为开发者提供现实世界可用的实现。而同时,这也有利于JavaScript的进一步发展,因为其团队可以在ECMAScript规范最后定稿前就获得来自现实世界的反馈。 Babel还能提升JavaScript的执行速度。由于JavaScript 文件加载和执行速度慢会严重影响用户体验,所以JIT没有时间在运行时执行所有技术上可行的优化。相比之下,Babel是在编译时运行,没有这么严格的时 间限制。借助强大的作用域跟踪和类型推断功能及插件系统,开发者可以构建转换器来执行此类优化,比如上文提到的闭包消除可以将闭包转换成平常的函数。
下一篇博客将重点讲一下Babel的生态系统及简单的使用。