Node.js从2009年诞生开始,到现在已有10岁,在这10年里,它的成长和成熟是大家有目共睹的。它因后端简化并发编程而被关注,因作为前端辅助开发工具而流行,因异步流程控制和回调地狱而被人诟病,因npm批量安装模块而被人敬仰。

作为技术领域里的明星项目,Node.js自诞生以来就一直处于风口浪尖之上。下面就来聊聊这些年Node.js被人们反复提起的“黑料”。

01 PART 版本帝?

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的核心代码已经非常稳定了,可以大规模使用。

02 PART 已无性能优势?

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极其完善的生态,可谓性能与生态双剑合璧,这是无与伦比的。

03 PART 异步和回调地狱

正因为异步特性,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需要学习了,后面会详细讲解。

04 PART 技术栈演进

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

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

狼书一出,Node再无遗册✪

Node.js在2009年横空出世时,确实是独一无二的。但在今天,已经10岁的Node.js有了更多、更广泛的应用场景,它的意义已经远远大于设计时的初衷了。随着大前端领域的蓬勃发展,跨平台开发、API构建、Web应用开发等场景愈加常见,Node.js也成为大前端开发的必备“神器”。

▊ 《狼书(卷2):Node.js Web应用开发》狼叔 著

本书主要讲解Node.js Web应用开发涉及的HTTP基础知识、常用开发框架、源码原理、数据库和项目实战,旨在向读者展示如何通过Node.js和Koa编写出更具前端特色的Web应用。

Koa立身于最“潮”的异步流程控制特性,主要用于改进Node.js开发中的回调地狱痛点,可以说Koa是异步流程控制不断演进的必然产物。在所有的Node.js Web框架中,Koa无疑是最耀眼的一个。

(扫码获取本书详情)

作 者 简 介


狼叔(网名i5ting),Node.js 技术布道者,“Node全栈”公众号作者,全栈技术实践者。曾就职于多家知名IT企业,从事前端开发、后端开发、数据分析等工作,目前负责公司内的Node.js开发和基础框架开发工作。

本 书 内 容


本书共分8章,每章的内容简介如下。

第1章  下一代Web框架Koa本章将介绍Koa框架的入门知识、优势、应用场景,Koa脚手架的编写方式,以及Node.js Web框架的演进过程。基于最新的AVA测试框架编写测试用例也是本章非常有特色的一节。

第2章  Koa核心扩展机制:中间件

本章将介绍Koa的核心中间件原理,以及Koa中常用的中间件:路由、视图、静态服务模块等。中间件机制是Koa的核心内容,因此本章内容非常重要。

第3章  HTTP必知必会

本章将介绍请求响应模型,也将对HTTP和HTTPS进行讲解,同时以mini-proxy和hiproxy为核心对前端最常用的代理进行讲解。

第4章  Koa练习

本章将结合第3章的HTTP相关知识进行Koa框架内置方法的练习,比如地址解析、参数获取、body解析、API开发,还将介绍各种测试模块和工具软件的用法。

第5章  数据库基础

本章将介绍Node.js数据库选型和MVC模型层的用法,以及使用Mongoose模块操作MongoDB的方法,其中涉及Mongoose中的一些进阶技巧:模型扩展、虚拟属性、回调钩子和插件机制。

第6章  数据库进阶

本章将在第5章的基础上介绍数据库中的进阶技巧:分页、关联查询、事务、性能调优等。通过本章大家能够对Node.js数据库选型掌握得更好。

第7章  前端视图模板

本章将从public目录讲起,介绍前端相关知识,主要涉及模板编译原理、Webpack进阶知识。本章还将介绍前后端分离和服务器端渲染的演进,并提出对未来Serverless环境下前端渲染层的见解。

第8章  项目实战

本章将以CNode项目为核心,介绍基于Egg.js框架的项目代码,还会介绍基于Docker快速开发Node.js Web应用的方法。

————

本书中的各章在内容上基本是相互独立的,因此各位读者可以挑选自己感兴趣的章节阅读。这本书是《狼书》系列图书的第2卷,第1卷主要介绍Node.js基础知识,第3卷主要介绍Node.js高级应用。3卷搭配阅读,效果更好。

  • 《狼书(卷1):更了不起的Node.js》
  • 《狼书(卷3):Node.js高级技术》(即将出版)

Node.js十年,你大爷还是你大爷相关推荐

  1. Node.js之十大Web框架

    Node.js之十大Web框架 之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了. 再到后来是因为Settings-Syn ...

  2. 二十六、深入Node.js中的文件系统fs模块

    @Author:Runsen @Date:2020/6/8 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  3. SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  4. SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上

    本教程迄今为止的前 54 个步骤,开发出来的 SAP UI5 应用都只能在本地通过 localhost 访问,除非将其部署到 ABAP 服务器上. SAP UI5 应用开发教程之三十五 - 如何把本地 ...

  5. 十年 | 我花了十年,才弄明白了Node.js

    Hello! 我是小小,今天是本周的第五篇,昨天一篇送书了,送的怎么样呢,欢迎下方留言哦! 大概所有的人都有一种屌丝变身高富帅的想法吧.可以这样的说,几乎所有的人,都肯定有过一夜暴富的想法.别捂脸,过 ...

  6. 腾讯云十亿级 Node.js 网关的架构设计与工程实践

    作者|王伟嘉 编辑|孙瑞瑞 本文由 InfoQ 整理自腾讯云 CloudBase 前端负责人王伟嘉在 GMTC 全球大前端技术大会(深圳站)2021 上的演讲<十亿级 Node.js 网关的架构 ...

  7. node JS獲取GPS_node学习笔记(三十八)

    一.什么是NodeJS? 1.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. 2.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效 ...

  8. JavaScript 编程精解 中文第三版 二十、Node.js

    二十.Node.js 原文:Node.js 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了<JavaScript 编程精解(第 2 版)> A stude ...

  9. 十 Node.js实现微信小程序支付功能

    十 Node.js实现微信小程序支付功能 一 开发前提 二 支付流程介绍 三 上代码 1.小程序端发起后台请求,完成统一下单 1.1 小程序端发起后台请求 1.2 Node.js后台接收请求,完成统一 ...

  10. DockOne微信分享(六十九):微服务选型之Modern Node.js

    本文讲的是DockOne微信分享(六十九):微服务选型之Modern Node.js[编者的话]目前Node.js的发展非常快,大家可能还停留在:Node.js性能很好,Node.js里都是回调,写起 ...

最新文章

  1. String比较.equals
  2. Apache日志配置参数说明
  3. 文本挖掘简介及软件安装
  4. BestCoder Round #85
  5. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1123:图像相似度
  6. android mysql开发工具_Android开发工具--adb的使用
  7. 解决idea启动项目报错:Unable to open debugger port(127.0.0.1:60157):java.net.SocketExceptionsocket closed
  8. 【面试】判断一棵二叉树是否为二叉排序树
  9. iOS项目中的网络请求和上下拉刷新封装
  10. 我的 Java 自学之路
  11. 计算机操作系统张尧学第四章课后答案,清华大学出版社-图书详情-《计算机操作系统教程(第4版)习题解答与实验指导》...
  12. 联合查询(多表查询)
  13. 安装office2007时发生错误1706
  14. PDF文件转换成图片的格式
  15. AI基础:图解Transformer
  16. java kryo_通过Kryo的序列化方式提升Netty性能
  17. 图的深度遍历(邓俊辉版)
  18. dao层和serivce层的作用和区别
  19. Excel电子表格隔行自动填充底色
  20. 【后续还会补充】Sublime Text 4 常用插件安装及配置方法

热门文章

  1. Spark Locality Level
  2. HDCP @ Locality Check
  3. css3 设置图片变灰(在微信端不能正常) 和透明
  4. LF-YOLO: A Lighter and Faster YOLO for Weld Defect Detection of X-ray Image
  5. 弘辽科技:淘宝店铺三低代表着什么?如何提升到三高?
  6. 百思不得姐php源码,微信小程序实战教程: 仿百思不得姐demo(附源码)
  7. 【Algorithm】一般约束优化问题——PHR算法及其Matlab实现
  8. Predicting Human Mobility via Graph Convolutional Dual-attentive Networks
  9. 奇迹服务器如何修改爆率,奇迹萌新教程系列-奇迹装备是否掉落配置调整
  10. matplotlib.pyplot如何绘制多张子图