本章内容
1:Node.js是什么
2:服务器端javascript
3:node的异步和事件触发本质
4:node为谁而生
5:node程序示例
1.1
node.js他的首次亮相是在2009年,非常流行,它在github受关注项目排行榜上位列第二(https://github.com/joyent/node),node创始人Ryan Dahl 2009年柏林JSCONF的网站上有node创始人Ryan Dahl第一次介绍node的视频。(已被拿掉)
官网上(http://www.nodejs/org)给node下的定义是:“一个搭建在Chrome JavaScript运行时上的平台,用于构建高速、可伸缩的网络程序。node.js采用的事件驱动、非阻塞I/O模型,使他既轻量又高效,并成为构建运行在封不上设备锁的数据密集型实时程序的完美选择。‘’
无论好坏,Javascript都是世界上最流行的编程语言,几乎遍布web上的每个角落,比较引入注目的先行者是Google地图和gmail,但类似的web应用有一大堆,从Twitter到facebook,再到github。
现代化JavaScript虚拟机的性能正在改变着可以构建在web上的应用类型。一个很有说服力的、坦率地说是令人震撼的例子是jslinux,一个运行在JavaScript中的PC模拟器,它能加载Linux内核,可以利用终端会话与其交互,还能编写C城西,而这一切都是在浏览器中完成的。
json是目前非常流行的数据交换格式,并且还是JavaScript原生的。
有些nosql数据库中庸的就是JavaScript语言(couchDB和MongoDB)。
JavaScript是一门编译目标语言,现在有很多可以编译成JavaScript语言。
node用的虚拟机V8会紧跟ECMAScript标准。换句话说,在node中如果想用新的JavaScript语言特性,不用等到所有浏览器都支持。
JavaScript成了一种引人瞩目的编写服务端应用的语言,Node已经赚足了眼球。但JavaScript知识整幅拼图中的一块,node使用Javascript的方式更加有趣。
1.2异步和事件触发:浏览器
node为服务端JavaScript提供了一个事件驱动的、异步的平台。它把JavaScript带到了服务端中的方式跟浏览器把JavaScript带到了客户端的方式几乎一模一样。他们都是事件驱动(事件轮询)和非阻塞的I/O处理(用异步I/O)。
例:
$.post('',function(data){
console.log(data);
//脚本继续执行
});
var = data = $.post('/resource.json');
console.log(data);//被阻塞,需要执行完上一行再执行
1.3异步和事件触发:服务器
在node中,I/O几乎总数在主事件轮询之外进行,是的服务器可以一直处于高效并且随时能够做除响应的状态,就像Nginx一样。这样进程不会受I/O限制,因为I/O延迟不会拖垮服务器,或者像在阻塞方式下那样占很多资源。因此曾经在服务器上是重量级的操作,在node服务器上仍然可以是轻量级的。
1.4DIRT程序
Node所针对 的应用程序有一个专门的简称:DIRT。他表示数据密集型实时程序(data-intensive real-time),因为node自身在I/O上非常轻量,它善于将数据从一个管道混排或代理到另一个管道上,这能在处理大量请求时持有很多开放的连接,并且只占用一小部分内存,它的设计目标是保证相应能力,跟浏览器一样。
对于web来说,实时程序是个新生事物。现在有很多web程序提供的信息几乎都是即时的,比如通过白板在线协作,对临近公交车的实时精准定位,以及多人在线游戏。不管是实时组件增强已有程序,还是打造全新的程序,web都在朝着响应式和协作型环境逐渐开发。而这种新型的web应用程序需要一个能够实时响应大量并发用户请求的平台来支撑他们。这正是node所擅长的领域,并不局限于web程序,其他的I/O负载比较重的程序也可以用到它。
Browserling就是一个用Node开发的DIRT程序,它是一个很好的范例。在这个网站上我们可以在浏览器中使用各种浏览器。这对web前端开发工程师来说特别有用。
1.5:默认DIRT
node从构建开始就有一个事件驱动和异步的模型。JavaScript从来没有过标准的I/O库,那是服务端语言常见的配置。对于JavaScript而言,这总数有宿主环境决定的,JavaScript最常见的宿主环境,也是大多数开发人员所用的,就是浏览器,他是事件驱动和异步的。
node重新实现了宿主中哪些常用的对象,尽量让浏览器和服务器保持一致,比如:
计时器API(setTimeout)
控制台API(console.log)
1.5.1简单的异步程序
$.post('',function(data){ console.log(data) })
require(res).readFile('./resource,json',function(error,data){ })
1.5.2hello world HTTP服务器
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('hello world')
}).listen(3000);
console.log('server running')
1.5.3流数据
node在数据流和数据流动上也很强大。你可以吧数据流看成特殊的数组,只不过数组中的数据分散在空间上,而数据流中的数据时分散在时间上的,通过将数据一块一块地传送,开发人员可以每收到一块数据就开始处理,而不用等到所有数据都到全了再做处理。
只要有新的数据块准备好,就会激发data事件,当所有数据库都加载完之后,会激发一个end事件。
node中也有可写数据流,可以往里写数据块。当http服务器上有情趣过来时,对其进行相应的res对象就是可写的数据流的一种。