《Node.js in action》一书里说,Node.js 所针对的应用程序有一个专门的简称:DIRT。它表示数据密集型实时(data-intensive real-time)程序。因为 Node.js 自身在 I/O 上非常轻量,它善于将数据从一个管道混排或代理到另一个管道上,这能在处理大量请求时持有很多开放的连接,并且只占用一小部分内存。它的设计目标是保证响应能力,跟浏览器一样。
这话不假,但在今天来看,DIRT 还是范围小了。其实 DIRT 本质上说的 I/O 处理的都算,但随着大前端的发展,Node.js 已经不再只是 I/O 处理相关,而是更加的“Node”!
Node.js 使用场景主要分为4大类
1)跨平台:覆盖你能想到的面向用户的所有平台,传统的PC Web端,以及PC客户端 nw.js/electron 、移动端 cordova、HTML5、react-native、weex,硬件 ruff.io 等
2)Web应用开发:网站、Api、RPC服务等
3)前端:三大框架 React \ Vue \ Angular 辅助开发,以及工程化演进过程(使用Gulp /Webpack 构建 Web 开发工具)
4)工具:npm上各种工具模块,包括各种前端预编译、构建工具 Grunt / Gulp、脚手架,命令行工具,各种奇技淫巧等
分类描述相关模块网站类似于cnodejs.org
这样传统的网站Express
/ Koa
Api同时提供给移动端,PC,H5
等前端使用的 HTTP Api
接口Restify
/ HApi
Api代理为前端提供的,主要对后端Api接口进行再处理,以便更多的适应前端开发Express
/ Koa
IM即时聊天实时应用,很多是基于 WebSocket
协议的Socket.io
/ sockjs
反向代理提供类似于 nginx
反向代理功能,但对前端更友好anyproxy
/ node-http-proxy
/ hiproxy
前端构建工具辅助前端开发,尤其是各种预编译,构建相关的工具,能够极大的提高前端开发效率Grunt
/ Gulp
/ Bower
/ Webpack
/ Fis3
/ YKit
命令行工具使用命令行是非常酷的方式,前端开发自定义了很多相关工具,无论是shell命令,node脚本,还是各种脚手架等,几乎每个公司\小组都会自己的命令行工具集Cordova
/ Shell.js
操作系统有实现,但估计不太会有人用NodeOS
跨平台打包工具使用 Web 开发技术开发PC客户端是目前最流行的方式,会有更多前端开发工具是采用这种方式的PC端的electron、nw.js,比如钉钉PC客户端、微信小程序IDE、微信客户端,移动的Cordova,即老的Phonegap,还有更加有名的一站式开发框架IonicframeworkP2P区块链开发、BT客户端webtorrent
/ ipfs
编辑器Atom
和 VSCode
都是基于 electron
模块的electron
物联网与硬件ruff.io和很多硬件都支持node sdkruff
Node.js 应用场景非常丰富,比如 Node.js 可以开发操作系统,但一般我都不讲的,就算说了也没多大意义,难道大家真的会用吗?一般,我习惯将 Node.js 应用场景分为7个部分。
1)初衷,server端,不想成了前端开发的基础设施 2)命令行辅助工具,甚至可以是运维 3)移动端:cordova,pc端:nw.js和electron 4)组件化,构建,代理 5)架构,前后端分离、api proxy 6)性能优化、反爬虫与爬虫 7) 全栈最便捷之路
编号场景说明1反向代理Node.js可以作为nginx这样的反向代理,虽然线上我们很少这样做,但它确确实实可以这样做。比如node-http-proxy和anyproxy等,其实使用Node.js做这种请求转发是非常简单的,在后面的http章节里,有单独的讲解。2爬虫有大量的爬虫模块,比如node-crawler等,写起来比python要简单一些,尤其搭配jsdom(node版本的jQuery)类库的,对前端来说尤其友好3命令行工具所有辅助开发,运维,提高效率等等可以用cli做的,使用node来开发都非常合适,是编写命令行工具最简单的方式,java8以后也参考了node的命令行实现4微服务与RPCnode里有各种rpc支持,比如node编写的dnode,seneca,也有跨语言支持的grpc,足够应用了5微信公众号开发相关sdk,框架非常多,是快速开发的利器6前端流行SSR && PWASSR是服务器端渲染,PWA是渐进式Web应用,都是今年最火的技术。如果大家用过,一定对Node.js不陌生。比如React、Vuejs都是Node.js实现的ssr。至于pwa的service-worker也是Node.js实现的。那么为啥不用其他语言实现呢?不是其他语言不能实现,而是使用Node.js简单、方便、学习成本低,轻松获得高性能,如果用其他语言,我至少还得装环境可以说目前大家能够看到的、用到的软件都有 Node.js 身影,当下最流行的软件写法也大都是基于 Node.js 的,比如 PC 客户端 luin/medis 采用 electron 打包,写法采用 React + Redux。我自己一直的实践的【Node全栈】,也正是基于这种趋势而形成的。在未来,Node.js 的应用场景会更加的广泛,更多参见 sindresorhus/awesome-nodejs。
参考文献:https://i5ting.github.io/How-to-learn-node-correctly/#1
Node核心:异步流程控制Node.js是为异步而生的,它自己把复杂的事儿做了(高并发,低延时),交给用户的只是有点难用的Callback写法。也正是坦诚的将异步回调暴露出来,才有更好的流程控制方面的演进。也正是这些演进,让Node.js从DIRT(数据敏感实时应用)扩展到更多的应用场景,今天的Node.js已经不只是能写后端的JavaScript,已经涵盖了所有涉及到开发的各个方面,而Node全栈更是热门种的热门。
直面问题才能有更好的解决方式,Node.js的异步是整个学习Node.js过程中重中之重。
- 1 异步流程控制学习重点
- 2 Api写法:Error-first Callback 和 EventEmitter
- 3 中流砥柱:Promise
- 4 终极解决方案:Async/Await
我整理了一张图,更直观一些。从09年到现在,8年多的时间里,整个Node.js社区做了大量尝试,其中曲折足足够写一本书的了。大家先简单了解一下。
- 红色代表Promise,是使用最多的,无论async还是generator都可用
- 蓝色是Generator,过度货
- 绿色是Async函数,趋势
结论:Promise是必须会的,那你为什么不顺势而为呢?
推荐:使用Async函数 + Promise组合,如下图所示。
其实,一般使用是不需要掌握上图中的所有技术的。对于初学者来说,先够用,再去深究细节。所以,精简一下,只了解3个就足够足够用了。
结论
Node.js SDK里callback写法必须会的。 Node.js学习重点: Async函数与Promise
- 中流砥柱:Promise
- 终极解决方案:Async/Await