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的原因之一。

下面对比了变革前后的技术栈选型,希望读者能够从中感受到其中的变化。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月16日

热门专题

安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校
大理科技管理学校|大理科技管理学校,大理科技,大理科技中等职业技术学校,大理科技管理中等职业技术学校,大理科技学校
大理科技管理学校
金诺幼儿园(春城路金诺幼儿园)|昆明官渡区幼儿园,幼儿园报名,官渡区幼儿园,春城路幼儿园,幼儿园招生,学前班,昆明幼儿园,金诺幼儿园,环城南路幼儿园,石井路幼儿园
金诺幼儿园(春城路金诺幼儿园)
云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专
自考本科|自考本科有用吗,自考文凭,自考本科文凭,自考文凭有用吗,自考本科文凭有用吗,自考文凭承认吗
自考本科
天麻的功效与作用吃法|天麻的功效与作用,天麻的功效与作用吃法,天麻炖什么治头痛最好,天麻的功效与作用禁忌,天麻多少钱一斤,天麻的功效与作用吃法及禁忌,天麻怎么吃效果最好,天麻粉的功效与作用,天麻怎么吃
天麻的功效与作用吃法

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部