什么是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来解决。


浙公网安备 33010602011771号