内容简介:Node.js从2009年诞生开始,到现在已有10岁,在这10年里,它的成长和成熟是大家有目共睹的。它因后端简化并发编程而被关注,因作为前端辅助开发工具而流行,因异步流程控制和回调地狱而被人诟病,因npm批量安装模块而被人敬仰。Node.js 是名副其实的版本帝,版本更新确实很频繁,时间线如下。
Node.js从2009年诞生开始,到现在已有10岁,在这10年里,它的成长和成熟是大家有目共睹的。它因后端简化并发编程而被关注,因作为前端辅助开发 工具 而流行,因异步流程控制和回调地狱而被人诟病,因npm批量安装模块而被人敬仰。
作为技术领域里的明星项目,Node.js自诞生以来就一直处于风口浪尖之上。下面就来聊聊这些年Node.js被人们反复提起的“黑料”。
Node.js 是名副其实的版本帝,版本更新确实很频繁,时间线如下。
•2013年,发布了0.10版本。
•2015年1月,发布了1.0.0版本(io.js)。
•2015年5月,发布了2.x版本(io.js)。
•2015年8月,发布了3.x版本(io.js)。
•2015年9月,Node.js基金会发布了5.0版本与io.js合并后的第一个版本。
•2015年10月,Node.js 5.2.0版本成为首个LTS(长期支持)版本。
•2015年年底,发布了5.2.4和5.5.0版本。
•2016年3月,发布了5.5.0 LTS版本和5.9.0 Stable稳定版本。
•2016年年底,6.0版本支持95%以上的ES6特性,7.0版本通过flag支持async函数,全面支持99%的ES6特性。
•2017年2月,发布了7.6版本,可以不通过flag使用async函数。
•2017年5月,发布了8.0版本,支持async Hooks,N-API等特性。
•2018年4月,发布了10.0版本,新增http2模块,将npm从v5.7更新到了v6,并且增强了对ESMModules的支持。
•2018年10月,发布了11.0版本,增加了多线程Worker Threads。
整体上来说,Node.js的发展趋于稳定。成立Node.js基金会能够让Node.js在未来获得更好的开源社区支持;发布LTS版本意味着Node.js SDK API趋于稳定;频繁发布版本虽然被很多人诟病,但换个角度来看,这也是社区活跃的一个体现,如果大家真的看了Changelog,便会发现,新版本相比于旧版本只增加了一些小的改进,而且是边边角角的改进,也就是说,Node.js的核心代码已经非常稳定了,可以大规模使用。
Node.js在2009年横空出世,可以说靠异步特性获得了很大的性能优势。所有语言几乎没有能和它相比的。但是福祸相依,因为性能太出众,所以促使很多语言、编程模型都纷纷进行改进,比如产生了 Go 语言,比如 PHP 里的SWoole框架可以支持异步协程了,再比如鸟哥(惠新宸)对PHP的VM进行了改进,大家似乎都以不支持异步为耻。后来的故事大家都知道了,各种语言的性能都得到了提高。
那么在这种情况下,Node.js还有优势吗?
在实现难易度上,Node.js除了异步流程控制稍复杂外,其他的都非常简单。比如在写法上,你可以选择编写面向过程、面向对象、函数式的程序。不要因为Node.js变化快,就觉得自己跟不上潮流。一般后端 程序员 转为Node.js开发人员时,几乎两周就能精通,这一点相比其他语言还是很有优势的。
在调优成本上,Node.js即使不进行优化,性能也非常好,另外,对Node.js进行优化也比其他语言更简单。
在学习成本上,Node.js是有优势的。学习其他语言,前后端至少要学两种以上,如果学习Node.js,你只需要学会JavaScript即可,可以少学一种语言。我想问,大前端离得开JavaScript吗?今日的前端还不够复杂吗?你真的有那么多精力学习更多语言吗?
其实大家可以关注一下基于npm的开源生态,截至2019年3月,npm上已有超过94.7万个模块,“秒杀”无数竞品。npm是所有开源包管理中最强大的,我们说“更了不起的Node.js”,其实npm居功甚伟。
下图展示了来自Module Counts的各个包管理模块的差异。
npm生态是Node.js的优势,可是说“Node.js没有性能优势”真的对吗?这其实是对Node.js的误解。Node.js的性能依然很好,不断迭代的版本其实就是在提升性能。而且Node.js具有npm极其完善的生态,可谓性能与生态双剑合璧,这是无与伦比的。
正因为异步特性,Node.jsAPI设计只能采用错误优先(Error-First)风格的回调约定,于是大家硬生生地把多层回调写成了回调地狱(callback hell),这时就有各种“黑粉”冒出来对Node.js进行攻击。
但正是因为回调地狱是最差的实践,所以大家才不得不求变,于是Thunk函数、Promise/A+规范等相继出现。虽然Promise/A+规范不是那么完美,但对于解决回调地狱问题来说已经足够。而且Generator特性和Generator的执行环境co模块也被逐渐引入新的异步解决方案,使得异步在写法上越来越接近于同步。当async函数落地的时候,Node.js 已经站在了同C#、 Python 一样的高度上,大家还有什么理由攻击它呢?
下面列举了Node.js支持的所有异步解决方案,并给出了推荐建议(5星为最高级别)。
从推荐指数可以看出,我们应首选async函数,但要注意版本问题,要使用最新的版本。其次就是Promise,它都能非常好地驾驭callback和async函数,尤其是在异常捕获、扩展上,具有明显的优势。
有时,将一件事做到极致,也许能收获另一片天地。异步流程控制是Node.js编程的核心,掌握异步流程控制之后,Node.js中就只剩API需要学习了,后面会详细讲解。
自从ES6规范在Node.js中落地之后,整个Node.js开发领域都发生了翻天覆地的变化。从v0.10开始,Node.js中就逐渐加入了ES6特性,比如Node.js v0.12可以使用Generator,这也促使寻求异步流程控制的TJ Holowaychuk写出了co这个著名的模块,进而产生了Koa框架。但是在v5.0之前,必须通过flag才能开启Generator支持,因此Koa v1.0迟迟未发布,在Node.js v5.0发布后,Koa v1.0才发布。
2015年,传统写法终结;2016年,变革写法开始兴起。其中核心变更是支持使用ES6语法编写Node.js代码。
◦可以使用Node.js v5.x+里的ES6特性,如果想实现更高级的功能,可以使用Babel编译支持ES7特性,或者使用TypeScript。
◦合理使用Standard或者xo模块代码风格约定。
◦适当引入ES6语法,只要Node.js SDK内置支持的,都可以使用。
◦大家要重视面向对象写法的使用,虽然ES6的面向对象机制不健全,但以后定会不断完善。面向对象对于大型软件开发更适合,这其实也是我推荐使用TypeScript的原因之一。
下面对比了变革前后的技术栈选型,希望读者能够从中感受到其中的变化。
本文选自 《狼书(卷1):更了不起的Node.js》 一书。
以上所述就是小编给大家介绍的《Node.js十年,你大爷还是你大爷》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Programming in Java
Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00
By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!