您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > NodeJS专题学习
什么是Node.js?2011-09-0214:47前不久Oreilly出了一本小册子“WhatisNode?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料。翻译出来,和大家分享~Node不是万能药!但的确能解决一些关键问题学习Node不是一件轻松事儿,但你所收到的回报是对得起你的付出的。因为当下Web应用开发中的诸多难题唯有JavaScript才能解决。目录专家们的警告!Node:几个小例子Node不是JavaScript,Node可以运行JavaScript和Node服务器的交互快速入门手册解释器之惑基于事件的Web应用Node的用武之地“你够酷吗?来用我吧!”Node.js为最新潮的编程语言提供了一系列很酷的API和工具箱,它可以直接应用于传统的Rails、Ajax、Hadoop、甚至可以某种程度上用于iPhone开发和HTML5。如果你参加过一些大型技术会议,你总是会听到一些关于Node.js的主题演讲,尽管这些话题对普通的开发者来说依然有些难以企及。你可能已经听说Node.js(有时我们将其简称为“Node”)是一个服务器端的解决方案,它可以运行JavaScript,并可以作为Web服务来处理HTTP请求。如果这些东东还不至于让你晕头转向的话,转眼间关于端口、sockets和线程的讨论就又成了当下最热门的话题,你会觉得这些东西让你眼花缭乱。这些内容真的属于JavaScript的范畴吗?为什么世界上那么多人宁愿将JavaScript脱离浏览器而运行,更不用说将JavaScript运行于服务器端了?好消息是,你所听到的(所想到的)关于Node的一切都是正确的。Node的的确确是属于网络编程的范畴,用以处理服务器端的请求和响应。坏消息是和之前的Rails、Ajax和Hadoop一样,真正实用的技术资料实在太少。等到基于Node的“优秀的”框架成熟之后,技术资料一定会跟得上的,但何必要等到技术书籍和教程都出来之后再去尝试使用Node呢?现在就使用Node,说不定会给你的代码带来意想不到的改观,甚至让你的程序变得更易实现。专家门的警告!和大多数技术一样,Node也是新瓶装旧酒:它看起来不透明而且很怪异,但独受小开发团队的青睐。如果你没有接触过Node,则需要学习一些很容易上手的服务器端脚本。你需要化时间来搞清楚Node,因为即便是运行于服务器端的JavaScript,它和客户端JavaScript也极为不同。实际情况是,你不得不自己给自己洗脑,以便重新学习理解围绕JavaScript的事件处理机制、异步IO和一些网络基础知识。不幸的是,这意味着如果你已经用Node作开发超过两年时间的话,你会觉得这篇文章内容很单调乏而且过于简单。你会开始寻找新的“刺激”,比如将Node运行于客户端,或者开始尝试事件I/O、反射器模式和npm。你会发现Node的世界是如此有趣,甚至很多Node高级技术具有某种史诗般的美感,而这些东西对于初学者来说依然是难于企及的。因此,或许你应该将你掌握的知识分享给你的同伴,尤其是对于那些不了解Node的同学,当他们开始对Node感兴趣时,给他们分享传授Node高级技术。Node:几个小例子首先,你应当意识到Node是用于运行独立的JavaScript程序的,而不是运行于浏览器中的某个HTML片段里。它是存放在文件系统中的真实存在的文件,由Node程序执行,以一种守护进程的模式运行,同时打开对某些端口的监听。跳过helloworld最经典的例子当然是“HelloWorld“,在Node官网()上有源码。几乎每个人都是从HelloWorld开始接触Node的。现在让我们跳过这个最简单的例子,来看一些更有趣的例子:实现一个可以从服务器发送文件到客户端的程序(而不仅仅是发送一段文本到客户端)。varsys=require(sys),http=require(http),url=require(url),path=require(path),fs=require(fs);http.createServer(function(request,response){varuri=url.parse(request.url).pathname;varfilename=path.join(process.cwd(),uri);path.exists(filename,function(exists){if(!exists){response.writeHead(404,{Content-Type:text/plain});response.end(404NotFound\n);return;}fs.readFile(filename,binary,function(err,file){if(err){response.writeHead(500,{Content-Type:text/plain});response.end(err+\n);return;}response.writeHead(200);response.end(file,binary);});});}).listen(1300);console.log(Serverrunningat);注:这段代码取名为t3.js,执行这段代码nodet3.js,在浏览器看不到任何输出。但是,如果把某个图片放在t3.js同一级目录下(比如p1.png,浏览器访问地址为:),你将能看到图片。仅仅二十多行代码就实现了一个图片服务器,是不是很厉害?感谢MikeAmundsen,他给出了这段代码的相似的实现。这个例子是由DevonGovett在Nettuts+上提交的一段代码,尽管已经根据新版本的Node作了更新,但Devon的整个帖子是一个非常好的入门学习教材,对于初学者来说更是如此。如果你是一个新手,你可以将上述代码保存到一个文本文件中,命名为NodeFileServer.js。在运行之前你需要一个Node运行环境,最新的Node版本可以从官网下载这个文件或者从github上将源码取下来。你需要编译源码,如果你没有用过Unix、对make和configure不甚熟悉,则需要查阅在线编译手册来寻求帮助。Node不是JavaScript,Node可以运行JavaScript刚刚你将NodeFileServer.js存成了某个文件,别担心,我们等下会回过头来运行它的。现在,让我们移步到现实当中来,在Unix中执行典型的配置和编译命令:./configuremakemakeinstall这让我们确信一个事实:Node不是JavaScript,Node是一个可以运行JavaScript的程序,但Node绝对不是JavaScript。实际上,Node是基于C写的程序。可以通过ls来查看Node/src目录中的文件,可以看到Node的源码:大多数人会以为,JavaScript是一门糟糕的语言,更不用说用它来实现服务器端的功能了,其实你只对了一半。不错,对于操作系统级别的Socket和网络编程来说,JavaScript可能并不能胜任。但Node并不是JavaScript实现的,它是基于C实现的。C语言是可以完美胜任任意量级的网络编程。而JavaScript则完全有能力将指令传递给C程序,然后由C程序来操控操作系统“地下城”。实际上,和C语言相比,JavaScript更容易被开发者们接触到,这是值得引起注意的地方,如果你想用Node进行一些严肃的编程的话,这个原因会被一再提及。Node的基本用法进一步反映出了Node是如何和JavaScript一起工作的,Node不是JavaScript。你可以通过命令行来运行它:—(bdm0509@Bretts-MacBook-ProSun,29May11)——————————(/Users/bdm0509/tmp/Node/src)——(09:09$)-exportPATH=$HOME/local/Node/bin:$PATH—(bdm0509@Bretts-MacBook-ProSun,29May11)——————————(/Users/bdm0509/tmp/Node/src)——(09:09$)-cd~/examples—(bdm0509@Bretts-MacBook-ProSun,29May11)————————————(/Users/bdm0509/examples)——(09:09$)-NodeNodeFileServer.jsServerrunningat现在你肯定对Node有个大概的了解了吧。对于这段命令行,的确还有很多知识点需要进一步解释说明,比如在端口1337到底发生了什么?但这里你只需知道,Node只是一个可以让你运行JavaScript的程序。读者不必纠结于Node如何和JavaScript协同工作,这里也不会对此做过多介绍,只要知道Node可以运行JavaScript,这就足够了。而且你只需学习JavaScript这一门编程语言即可,不用担心自己不懂C语言。记住这是最最重要的一点,不必了解C也可写出Node可运行的程序。和Node服务器的交互刚才我们在Node上运行了NodeFileServer.js。这时你可以访问你本机的1337端口,可以看到正常的输出。没错,输出结果不足为奇。但应当意识到我们只用短短20行代码就实现了一个文件服务器。输出结果是你刚刚保存的脚本源文件的文本,并没有以二进制的形式输出。这个文件服务器可以输出它上面的任何文件。如果在同样目录下放入一张图片,在URL后缀中写上图片文件名,就像这样:。Node也可以展示出二进制的图片文件。当你回头再看这段短小的程序时,一定觉得这太不可思议了。用JavaScript轻易就能写出一个你想要的服务程序难道不让人感到惬意吗?不仅如此,假设你想写一个可以处理多个请求的服务(这是一个提示,同时打开四个五个甚至十个浏览器访问服务器),这也是很容易做到的。Node让人着迷的地方在于,你完全可以用很简单而且很不起眼的JavaScript程序来完成你想要的这些结果。快速入门手册围绕Node的话题总是会比纯粹运行在服务器端的代码更值得花点时间来讨论。不管怎样,我们还是从一段代码开始我们的话题,概览一下NodeFileServer.js文件,观察代码:varhttp=require('http');http.createServer(function(req,res){res.writeHead(200,{'Content-Type':'text/plain'});res.end('HelloWorld\n');}).listen(1337,127.0.0.1);console.log('Serverrunningat);首先调用了函数require(),require()是程序员最常用的函数之一。实际上,在CommonJS规范中也有提到这个函数,在讨论到关于JavaScript模块概念的时候有提及,此外,DavdFlanagan在2009年的一个很酷的实现中也有提到。换句话说,require()对于你来说可能是个新鲜事物,但它不是Node随意添加的一个函数,他是使用JavaScript进行模块化编程的核心概念,Node将这一特性发挥的淋漓尽致。接下来,http变量用以创建一个服务器。这个服务使用一个回调函数来处理当产生一个连接时的动作。这里的回调函数并未对请求作过多修饰,仅仅以t
本文标题:NodeJS专题学习
链接地址:https://www.777doc.com/doc-3263346 .html