深入浅出Node.js——Node特性介绍

Node

Node为什么使用JavaScript

Node使用JavaScript的主要原因:JavaScript比C的开发门槛低,并且后端一直没有市场,所以为其导入非阻塞I/O库没有额外的阻力。另外,JavaScript在浏览器中有广泛的事件驱动方面的应用。第三,当时浏览器大战中Chrome浏览器的JavaScript引擎V8摘得性能第一的桂冠,并且其基于新BSD许可证发布,收到了Node开发者的欢迎。

基于上面三点:非阻塞I/O,事件驱动和高性能的优点,JavaScript成为了Node的实现语言。

为什么叫Node

起初,Node的项目还叫web.js,就是一个Web服务器(实际上开发者一开始想的就是开发事件驱动、非阻塞的服务器)。但是项目发展变成了构建网络应用的一个基础框架,这样就可以在它的基础上构建更多的东西,比如服务器、客户端、命令行工具等等。

所以Node发展为一个强制不共享任何资源的单线程、单进程系统,每一个Node进程都构成这个网络应用中的一个节点,这就是它名字的真正含义。

Node的特点

异步I/O

下面的代码用于发起一个Ajax请求:

$.post('/url', {title: 'Node.js'}, function (data) { 
 	console.log('收到响应'); 
}); 
console.log('发送Ajax结束'); 

之前很多文章都是关于I/O的,很明显大概率“发送Ajax结束”应该在收到响应之前。因为调用$.post后,后续代码是被立即执行的,而function内的代码执行时间是不被预期的。

在Node中,同样的异步代码也很常见,比如下面的代码:

var fs = require('fs'); 
fs.readFile('/path', function (err, file) { 
 console.log('读取文件完成') 
}); 
console.log('发起读取文件'); 

事件与回调函数

下面的例子展示的是Ajax异步提交的服务器端处理过程,Node创建一个Web服务器,并监听8080端口。对于服务器,我们为其绑定了request事件,对于请求对象,我们为其绑定了data事件和end事件:

var http = require('http'); 
var querystring = require('querystring'); 
// 监听服务器的request事件
http.createServer(function (req, res) { 
 var postData = ''; 
 req.setEncoding('utf8'); 
 // 监听请求的data事件
 req.on('data', function (trunk) { 
 postData += trunk; 
 }); 
 // 监听请求的end事件
 req.on('end', function () { 
 res.end(postData); 
 }); 
}).listen(8080); 
console.log('服务器启动完成'); 

相应的,我们在前端为Ajax请求绑定了success事件,在发出请求后,只需关心请求成功时执行相应的业务逻辑即可:

$.ajax({ 
 'url': '/url', 
 'method': 'POST', 
 'data': {}, 
 'success': function (data) { 
 // success事件
 } 
}); 

事件的编程方式具有轻量级、松耦合、只关注事务点等优势,但是在多个异步任务下,事件与事件各自独立,如何协作是一个问题

Node除了异步和事件外,回调函数也是一大特色。说明了Node实际上是异步非阻塞的。

单线程

Node保持了JavaScript在浏览器中单线程的特点,而且在Node中,JavaScript与其余线程是无法共享任何状态的。

其缺点如下:

  • 无法利用多核CPU
  • 错误会引起整个应用退出,应用的健壮性值得考研。
  • 大量计算占用CPU导致无法继续调用异步I/O

像浏览器中的JavaScript长时间执行会导致UI的渲染和相应被终端。在Node中,长时间的CPU占用也会导致后续的异步I/O发不出调用,已完成的异步I/O的回调函数也会得不到及时执行。

后来,Node采用了子进程来处理单线程中大量的计算问题:child_process。通过将进程发送给紫禁城,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递结果。

Node面向网络且擅长并行I/O,能够有效的组织其更多的硬件资源。
I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值