Node.js入门经典 读书笔记(3)
本章中我们将讲述Node.js的作用
1、设计Node.js的目的
Node.js是构建在Chrome的JavaScript运行时之上的一个平台,用于简单构建快速的、可扩展的网络应用程序。Node.js使用事件驱动的、非阻塞的I/O模型,这让其既轻量又高效,是运行于不同发布设备上的数据密集型实时应用程序的完美平台。
并发简单的可以理解为指的是许多人同时尝试做同样的事情。
2、I/O理解操作
I/O是输入/输出的简写,指的是计算机和人或者数据处理系统之间的通信。可以使用很类似于PHP一样的语句来进行输出。即echo。
2.1 处理输入
计算机编程是什么?计算机编程就是编写解决某一个问题的软件并且处理围绕着该问题的可能的各种不可预测性。
2.2 联网I/O的不可预测性
当今的Web应用程序的设计变得越来越复杂。I/O变得更加的碎片化,而且I/O操作也变得更为频繁。
- 与第三方应用程序编程接口(API)的交互繁重
- 许多不同设备发送与接收数据,包括移动设备、电视和公告板等等
- 巨大数量的客户同时连接并实时交互
3、不可预测性
例子:使用Node.js从不同的Web服务器上获取主页。
1 var http = require('http'), 2 urls = ['shapeshed.coom', 'www.bbc.co.hk', 'www.baidu.com']; 3 4 function fetchPage (url) { 5 var start = new Date(); 6 http.get({host: url}, function (res) { 7 console.log("Got response from: " + url); 8 console.log("Request took:", new Date() - start, 'ms'); 9 }); 10 } 11 12 for (var i = 0; i < urls.length; i++) { 13 fetchPage (urls[i]); 14 }以上的代码,在不同次运行的时候会输出不同的时间,这也就是由于Web服务器响应时间不同导致的。而这些不同也是由于以下原因导致:
- 解析DNS请求的时间
- 服务器的繁忙程度
- 要应答的数据有多大
- 服务器和客户的可用带宽
- 为响应而服务的软件的效率
- 所使用的网络繁忙程度
- 数据要传输多远
在传统的HTML页面中使用JavaScript,例如,当用户单击页面超链接时,有事件被触发,而JavaScript代码并不是对一组用户可能进行的动作按线性排序列出,然后以此构造代码;而是围绕事件来构架。事件可在任何时刻发生,也可发生不止一次。以上所描述的就是事件驱动的编程,因为在程序中要是有事情发生的话那么有个事件必须发生。事件驱动编程是处理不可预测性的极佳方式,因为我们可以识别将要发生的事件,即使我们并不知道事件什么时候会发生。
JavaScript在浏览器中极高效地使用了这个模型,允许开发人员创建基于浏览器打的富应用程序,这样的应用程序围绕着事件和用户与页面之间的交互方式编写。
现代Web应用程序的趋势:
- 许多不同类型的设备可连接到Web应用程序
- 设备可作为输入和输出
- 在一个应用程序内,不同的服务由不同的服务器来完成
- 应用程序与许多第三方数据源的交互很繁重
- 客户与服务器之间的数据实时双向流动
而通过以上的比较可以发现,所有的趋势都指向了并发。Node的事件化的I/O模型让我们无需担心互锁和并发这两个在多线程异步I/O中常见的问题。Node.js将JavaScript解决不确定性所用的事件驱动方法加入到解决并发程序的可能方法清单中。事件驱动编程并不是新的思想。其他语言同样实现过,而解决并发问题多的其他方法还包括线程以及使用不同的进程。