什么是Node.js?

node.js是一套编写高性能并发web应用的JavaScript框架,完全事件驱动IO,基于V8引擎,它提供了一种在web浏览器之外运行JavaScript的途径。JavaScript广泛应用于网站的前端开发。Node使得这种流行的编程语言能够在更多环境下运行,甚至是网站的服务器端。

Node不是万能药!但的确能解决一些关键问题

Node.js为最新潮的编程语言提供了一系列很酷的API和工具箱,它可以直接应用于传统的Rails、Ajax、Hadoop、甚至可以某种程度上用于iPhone开发和HTML5。

Node.js是一个服务器端的解决方法,它可以运行JavaScript,并可以作为Web服务来处理HTTP请求。

Node的的确确是属于网络编程的范畴,用以处理服务器端的请求和响应。

你不得不自己给自己洗脑,以便重新学习理解围绕JavaScript的事件处理机制、异步IO和一些网络基础知识。

 

首先,你应当意识到Node是用于运行独立的JavaScript程序的,而不是运行于浏览器中的某个HTML片段里。它是存放在文件系统中的真实存在的文件,由Node程序执行,以一种守护进程的模式运行,同时打开对某些端口的监听。

NodeFileServer.js

View Code
 1 var sys=require("sys");
 2 http=require("http");
 3 url=require("url");
 4 path=require("path");
 5 fs=require("fs");
 6 http.createServer(function(request,response){
 7     var uri=url.parse(request.url).pathname;
 8     var filename=path.join(process.cwd(),uri);
 9     path.exists(filename,function(exists){
10         if(!exists){
11             response.writeHead(404,{"Content-Type":"text/plain"});
12             response.end("404 Not Found\n");
13             return;
14         }
15         fs.readFile(filename,"binary",function(err,file){
16             if(err){
17                 response.writeHead(500,{"Content-Type":"text/plain"});
18                 resposne.end(err+"\n");
19                 return;
20             }
21             response.writeHead(200);
22             response.end(file,"binary");
23         });
24     });
25 }).listen(8090);
26 console.log("Server running at http://localhost:8090/");

 Node不是Javascript,Node是一个可以运行javascript的程序,但Node绝对不是javascript。实际上,Node是基于C写的程序。

Node并不是Javascript实现的,它是基于C实现的。C语言是可以完美的胜任任意量级的网络编程的。而Javascript则完全有能力将指令传递给C程序的,然后由C程序来操控操作系统"地下城"。

View Code
1 var http=require("http");
2 http.createServer(function(req,res){
3     res.readHead(200,{"Content-Type":"text/plain"});
4     res.end("Hello World\n");
5 }).listen(1337,"127.0.0.1");
6 console.log("Server running at http://127.0.0.1:1337/");

首先调用了函数require(),他是使用Javascript进行模块化编程的核心概念,Node将这一特性发挥的淋漓尽致。
接下来,http变量用以创建一个服务器。这个服务使用一个回调函数来处理当产生一个连接时的动作。这里的回调函数并未对请求作过多修饰,仅仅以text/plain格式输出一个字符串“Hello World”作为请求响应。

实际上,这里展示了使用Node的标准模式:

定义交互类型,并获得一个用以处理这个交互的变量(通过require())。

创建一个新的服务(通过createServer())。

给服务绑定一个回调,用以处理请求。包括处理请求的函数应当包括一个请求...,以及一个响应

通知服务器启迪服务,这里需要指定IP和端口(通过listen)。

JSON是如今最流行的传输数据的格式。

Ajax可以比作“把在线拍卖网站里的某些吉他的信息发给我”。这个请求通过网络到达一个运行PHP程序的服务器。PHP服务器不得不给JavaScript返回很多信息,而且这些信息必须以某种形式的数据包发给客户端,而且这个数据包是可以被JavaScript解析的。因此数据可以打包成数组,然后转换为JSON。

对实体代码微妙的破坏性

在前端和后端都采用同样的原因javascript,在作JSON解析时是无障碍的,而当前端使用javascript作为JSON编码,后台用PHP作JSON解码时,多少会因为多种语言的JSON解析的实现不同而带来一些兼容性问题。

在上个例子中,解释器就是指内置的JSON解析器或者实现解析JSON的代码,这实际上依赖了两样东西:和eval()解析响应文本的操作一样的语句Java的JSON解析器,以及基于PHP的JSON解析器。

 

Javascript中eval()的潜在隐患

当然,如果没有任何其他上下文的约束,在Node中也是允许使用eval()的,因此eval()的隐患在Node依然存在。毕竟Node的目的并不是完全解决eval()的问题。Node被称之为基于事件的JavaScript或基于时间的I/O,这里所说的“基于事件”是Node中非常重要的概念。但要彻底理解什么事基于事件,以及为什么基于事件能让你规避eval()的危险,则需要理解JSON在应用之中是如何工作的,此外还要搞清楚适应于Web应用典型架构的特有数据结构。

基于时间的Web应用

一次性发送大量数据

因为太多菜鸟程序员似乎根本没有意识到eval()的问题有多严重。

不断的发送少量的数据

你应当基于大量的事件发送大量的请求,每个请求的数据包都很小,或者根据需要从后台抓取少量数据,而不是发送很少的请求,每次请求都带有大量的数据。

Node的目标是提供一种构建可伸缩的网络应用的方案,在Hello world例子中,服务器可以同时处理很多客户端连接。Node和操作系统有一种约定,如果创建了新的链接,操作系统就将通知Node,然后进入休眠。如果有人创建了新的链接,那么它(Node)执行一个回调,每一个链接只占用了非常小的(内存)堆栈开销。

Node是无阻塞的,不会出现同源竞争线程的情况(Node非常乐于处理即时的请求,发生了什么事情,那就让他发生吧),新请求到达服务器时,不需要为这个请求作什么事情。Node仅仅是悠闲的坐在那里等待(请求的发生),有请求就处理请求。

 

Node更擅长处理体积小的请求以及基于事件的I/O,使用Node解决客户端和服务器之间的快速沟通,使用表单提交将大量的数据发送给服务器,使用PHP和Perl来处理重型数据库操作以及动态HTML页面的生成。使用Node运行于服务器端来处理体积不大的请求。

 

学习Node所面临的挑战是,你需要更加活跃思维,将程序拆成低耦合的小片段,然后像组装数组一样的组装他们。但Node和基于事件的I/O并不能解决所有问题,但确定的是,很多关键问题,只能依靠Node来解决。 

 

 

posted @ 2014-10-10 10:50  Damon201611  阅读(205)  评论(0)    收藏  举报