博客原文地址:Claiyre的个人博客 https://claiyre.github.io/
博客园地址:http://www.cnblogs.com/nuannuan7362/
如需转载,请在文章开头注明原文地址
前言
作为一名前端er,即便没有用过,想必也听说过很多次Node了。在接触Node前,我对它印象大致有:
- 问世不久就迅速风靡web界
- 前端用js就可以写后端了
- 速度快
鉴于它的火热程度和前端er特有的好奇心,博主决定深入了解一下这个神奇的Node。并在此将学习心得记录下来,用于巩固和分享。
正文
Node的作者Ryan Dahl在2009年5月在github上发布了其最初的版本,除了Node这个名字外,它还有很多别称,如Nodejs,NodeJS,Node.js等。它是通过通信协议来组织许多个Node,非常容易通过扩展构建大型应用。每一个Node进程都构成这个网络应用的节点,这也是node名称的由来。
Node的特征
Node只是将前端中广泛应用的思想迁移到了服务器端,它没有改变JavaScript语言本身的任何特性,依旧基于作用域和原型链。它有如下特点:
异步I/O
和Ajax原理类似,Node也应用了异步I/O,大多数的Node操作都异步的方式进行调用,无需等待前一调用的结束,极大的提升了效率。以Ajax异步调用为例,下面这张图清楚的阐释了异步I/O的原理:事件与回调函数
Node将前端浏览器中应用广泛且较成熟的引入后端,配合异步I/O,将事件点暴露出来,形成整体逻辑。
如下面这个例子,服务器端处理Ajax异步提交的过程:
var http = require('http');
//侦听服务器的request事件
http.createServer(function (req,res){
var postData = " ";
req.setEncoding = ('utf8');
//侦听请求的data事件
req.on("data",function (chunk){
postData += chunk;
});
//侦听请求的end事件
req.on("end",function (){
res.end(postData);
});
}).listen(8080);
console.log('服务器已启动');
事件的编程方式具有轻量级,松耦合,只关注事物点等优势,但在多个异步场景下,事件与事件相互独立,如何协作是一个问题。从上面可以看到,回调函数无处不在。Node除了异步和事件外,回调函数也是一大特色。纵观下来,回调函数也是最好的接受异步调用返回数据的方式。
3. 单线程
Node保持了JavaScript在浏览器中是单线程的特点。单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,既没有死锁的存在,也没有线程上下文切换所带来的性能上的开销。但单线程也有它的缺点,如
- 无法利用多核CPU
- 错误会引起整个应用退出
- 大量计算长时间占用CPU,导致无法继续调用异步I/O
Node利用“子进程机制”来解决这些问题。通过将计算分发到各个子进程,可以将大量计算分解掉。然后再通过进程之间的事件消息传递结果,很好得保持应用模型的简单和低依赖。
4. 跨平台
起初,Node只能在Linux平台上。随着Node的发展,微软注意到了它的存在并投入了一个团队帮助Node实现Windows平台的兼容。下图是Node基于libuv实现跨平台的架构示意图:
Node的使用者
- 前后端编程环境的统一。这类的代表是雅虎。雅虎开放了Cocktail框架,利用自身身后的前端沉淀,将YUI3这个前端框架的能力要借助Node延伸到了服务器端,使得使用者摆脱了日常工作中一边写JavaScript一边写PHP带来的上下文交换负担。
- Node带来的高性能I/O用于实时应用。典型代表有腾讯,花瓣网,蘑菇街等。腾讯将NOde应用在长连接中已提供实时功能。后两者通过socket.io实现实时通知。
- 并行I/O使得使用者可以更高效地利用分布式环境。 阿里巴巴与ebay是这方面的典型。
- 并行I/O,有效利用稳定接口提升web渲染能力。 放弃同步等待式的顺序请求,大胆采用并行I/O,加速数据获取,从而提升Web的渲染速度。
- 云计算平台提供Node支持。 微软将Node引入Azure的开发中,阿里云、百度纷纷在云服务器上提供Node应用托管服务。
- 游戏开发领域。 游戏领域对实时和并发有很高的要求。网易pomelo实时框架,可以应用在游戏和高实时应用中。
- 工具类应用。过去依赖Java或其他语言编写的工具类应用,纷纷被一些前端工程师用Node重写,用前端熟悉的语言构建熟悉的工具。
结语
Node在开发高并发、高性能的后端服务程序上有着极大的优势,也正是Node,让JavaScript这门仅活跃于网页编程的脚本语言可以驱动复杂的后端程序。个人认为,Node的出现,对前端领域而言,是一次极大的飞跃,值得每一位前端工程师认真对待并学习。