如果你有一定的前端基础,比如HTML、CSS、JavaScript、jQuery;那么,Node.js能让你以最低的成本快速过渡成为一个全栈工程师,从而触及后端和移动端的开发。
像现在非常火热的Vue.js,Rect...,很多数据层动态交互优先选用了Node.js;So,这为你为什么要学习它又增加了一大理由。
一、什么是Node.js
本人之前一直对于Node.js存在误区,以为它也是一门语言,其实并不然。
Node.js 是谷歌 V8 引擎、libuv平台抽象层以及主体使用 Javscript 编写的核心库。三者集合的一个包装外壳,大量使用了使用事件驱动来实现异步开发。此外,在实时的Web应用上采用了基于 WebSocket 的推送技术,客户端和服务器端都可以发起通信,能够自由地交换数据。非常优雅、实用的打通了前后端。
V8是谷歌开发的,目前公认最快的 Javascript 解析引擎,并且具备服务器端解析能力。libuv 是一个开源的、为 Node 定制而生的跨平台的异步 IO 库。
简单的说Node 就是 JavaScript 语言在服务器端的运行环境。
- 所谓“运行环境(平台)”有两层意思:
- 首先,JavaScript 语言通过 Node 在服务器运行,在这个意义上,Node 有点像 JavaScript 虚拟机;
- 其次,Node 提供大量工具库,使得 JavaScript 语言与操作系统互动(比如读写文件、新建子进程),在这个意义上, Node 又是 JavaScript 的工具库。
所以:node是一个JavaScript的运行环境(平台),不是一门语言,也不是JavaScript框架
二、Node.js 是全能的么?
2.1 Node.js擅长做的
第一大类:后台管理系统、实时交互系统、联网软件、高并发量的web应用程序;
第二大类:基于web、canvas等多人联网游戏;
第三大类:基于web的多人实时聊天客户端;
第四大类:单页面浏览器应用程序;
第五大类:操作数据库、为前端和移动端提供基于json的API;
第六大类,....
就拿实时聊天客户端来窥探下Node.js:
- 统一协议端口:从 IRC 开始,有许多开源或者不开源的协议都运行在非标准端口上, 使用Node.js 则统一在标准的80端口运行 WebSockets。
- 无需太复杂的计算:轻量级、高流量并且能良好的应对跨平台设备上运行密集型数据。
- 对象数据库接口:Node.js十分适合通过对象数据库(object DB)来查询数据(如 MongoDB)。以 JSON 格式存储的数据允许 Node.js 直接处理,不需要纠结数据转换和匹配的问题。
- 队列输入: 聊天应用要处理高量并发的数据,而Node.js的队列输出正解决了这个问题:在数据真正的写入之前就承认客户端的数据是真实的。(开发中通常的做法是,种耗时的操作通过回调函数来异步处理,主线程继续往下执行)
- 数据流接收数据:我们可以在线处理正在上传中的文件,因为数据是通过流的形式进行接收。那么,实时音频和实时视频在一个网页上就能进行,无需再通过一个应用程序。
2.2 Node.js不擅长做的
第一大类:使用关系型数据库的服务端 WEB 应用;
因为,Express.js目前还不足以支撑所有的开发需求。
第二大类:有繁重的服务端计算和处理的应用。
凡是涉及CPU密集型操作都会削弱掉 Node通过事件驱动, 异步 I/O 模型等等带来的在吞吐量上的优势,因为当线程被非异步的高计算量占用时任何传入的请求将被阻塞。
为什么现在大家都在用Node.js
这个主要和Node.js的工作原理息息相关。
Node.js 最大的用武之地在于建设高性能、高扩展性的互联网应用---因为它能够处理庞大的并且高吞吐量的并发连接。主要是因为node.js的以下几大特性:
- event-driven 事件驱动
- non-blocking 非阻塞的异步I/O调用
- lightweight 省空间、省设备,轻量意味着更好的移植性
- Node.js是跨平台的项目,可以运行在Linux、Unix、Windows
- efficient 高效(node.js是基于单线程)
在PHP或者JSP中,是每个新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。而 Node.js 仅仅只运行在一个单线程中,使用非阻塞的异步 I/O 调用,所有连接都由该线程处理,在 libuv 的加分下,可以允许其支持数万并发连接(全部挂在该线程的事件循环中)。
注意:Node.js也有潜在的缺陷,比如:如果所有客户端的请求共享单一线程时也会有问题, 大量的计算可能会使得 Node 的单线程暂时失去反应, 并导致所有的其他客户端的请求一直阻塞, 直到计算结束才恢复正常;
因此,开发时千万不要让一个 Exception 阻塞核心的事件循环,因为这将导致 Node.js 的应用程序崩溃。比如在 PHP 中某个页面挂掉是不会影响网站运行的,但是 Nodejs 是一个线程一个线程来处理所有的链接,因此一旦异常阻塞了都可能会影响到其他所有的链接。
在什么场合下使用Node.js最好呢?
如果在你的项目需求中不包含CPU密集型操作,也不需要访问任何阻塞的资源,那么你就可以利用的 Node.js 的优点,尽情、快速、可扩展的去开发任何网络应用。
因为,Node.js 从来就不是用于解决大规模计算问题而创建的。** 它的出现是为了解决大规模I/O 的问题,并且在这一点上做的非常好。**
在接下来的Node.js 开发中,你会发现绝大多数问题是由误用阻塞操作而造成的。因此,要十分小心避免这个问题。