node.js学习

1.什么是node.js:

  Node.js从2009年诞生至今,已经发展了4年有余,其成长的速度有目共睹,Node.js的前景获得了技术社区的肯定。InfoQ一直在关注Node.js的发展,在近来几年的Qcon大会(北京站和杭州站)都有专门的讲座。为了更好地促进Node.js在国内的技术推广,我们决定开设“深入浅出Node.js”专栏,邀请来自Node.js领域的布道师、开发人员、技术专家来讲述Node.js的各方面内容,让读者对Node.js有更深入的了解,并且能够积极投入到新技术的讨论和实践中。
2.Node.js不是JS应用,而是JS运行平台
  Node.js不是js应用,而是js运行平台。Node.js采用C++语言编写而成,是一个JavaScript的运行环境。之所以采用C++语言的原因是:据Node.js创始人 Ryan Dahl回忆,最初他希望采用Ruby来写Node.js,但是后来发现Ruby虚拟机的性能不能满足他的要求,后来他尝试采用V8引擎,所以选择了C++语言。既然不是JavaScript应用,为何要叫.js呢?因为Node.js是一个JavaScript的运行环境。提到JavaScript,首先想到的是日常使用的浏览器,现代浏览器包含了各种组件,包括渲染引擎,JavaScript引擎等,其中 JavaScript引擎负责解释执行网页中的JavaScript代码。作为web前端最重要的语言之一,JavaScript一直是前端工程师的专利。不过,Node.js是一个后端的Javascript运行环境(支持的系统包括*nux,Windows),这意外着你可以编写系统级或者服务器端JavaScript代码,交给Node.js来解释执行,简单的命令类似于:
#node  helloworld.js
  Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级API,如文件操作,网络编程等。浏览器端的JavaScript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。相比之下,Node.js则是一个全面的后台运行时,为JavaScript提供了其他语言能够实现的许多功能。
3.Node.js采用事件驱动,异步编程,为网络服务而设计
  事件驱动这个词并不陌生,在某些传统语言的网络编程中,我们会用到回调函数,比如当socket资源达到某种状态时,注册的回调函数就会执行。Node.js的设计思想中以事件驱动为核心,它提供的绝大多数API都是基于事件的,异步的风格。以net模块为例,其中的net.Socket对象就有以下事件:connect,data,end,timeout,drain,error,close等,使用Node.js的开发人员需要根据自己的业务逻辑注册相应的回调函数。这些回调函数都是异步执行的,这意外着虽然在代码结构中,这些函数看似是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。事件驱动,异步编程的设计,重要的优势在于,充分利用了系统资源,执行代码无需阻塞等待某种操作完成,有限的资源可以用于其他的任务。此类设计非常适合于后端的网络服务编程,Node.js的目标也在于此。在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册,异步函数,开发人员可以提高资源的利用率,性能也会改善。
  从Node.js提供的支持模块中,我们可以看到包括文件操作在内的许多函数都是异步执行的,这和传统语言存在区别,而且为了方便服务器开发,Node.js的网络模块特别多,包括HTTP,DNS,NET,UDP,HTTPS,TLS等,开发人员可以在此基础上快速构建web服务器。以简单的helloworld.js为例:
var http = require('http');
http.createServer(function  (req, res))  {
      res.writehead(200,  {'Content-Type': 'text/plain'});
      res.end('hello world\n');
}).listen(80, "127.0.0.1");

上面的代码搭建了一个简单的http服务器(运行示例部署在http://helloworld.cnodejs.net/中),在本地监听80端口,对于任意的http请求,服务器都返回一个头部状态码为200,Content-Type值为text/plain的hello world文字响应。从这个小例子中,我们可以看出几点:

  Node.js的网络编程比较便利,提供的模块(在这里是http)开放了容易上手的API接口,短短几行代码就可以构建服务器。

  体现了事件驱动,异步编程,在createServer函数的参数中指定了一个回调函数(采用JavaScript的匿名函数实现),当有http请求发送过来时,Node.js就会调用该回调函数来处理请求并响应。当然,这个例子相对简单,没有太多的事件注册,在以后的文章中读者会看到更多的实际例子。

4.Node.js的特点

  下面我们来说说Node.js的特点。事件驱动,异步编程的特点刚才已经详细说过了,这里不再重复。Node.js的性能不错。按照创始人Ryan Dahl的说法,性能是Node.js考虑的重要因素,选择C++和V8而不是Ruby或者其他的虚拟机也是基于性能的目的。Node.js在设计上也是比较大胆,它以单进程,单线程模式运行(很吃惊,对吧?这和JavaScript的运行方式一致),事件驱动机制是Node.js通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换,这意外着面对大规模的http请求,Node.js凭借事件驱动搞定一切,习惯了传统语言的网络服务开发人员可能对多线程并发和协作非常熟悉,但是面对Node.js,我们需要接受和理解它的特点。由此我们是否可以推测出这样的设计会导致负载的压力集中在CPU(事件循环处理?)而不是内存(还记得Java虚拟机抛出OutOfMemory异常的日子吗?),眼见为实,不如来看看淘宝共享数据平台团队对Node.js的性能测试

物理机配置 :RHEL5.2,CPU2.2GHZ,内存4G

Node.js应用场:MemCache代理,每次取100字节数据

连接池大小:50

并发用户数:100

测试结果(socket模式):内存(30M),QPS(16700),CPU(95%)

从上面的结果,我们可以看到在这样的测试场景下,qps能够达到16700次,内存仅占用30M(其中V8堆占用22M),CPU则达到95%,可能成为瓶颈。此外,还有不少实践者对Node.js做了性能分析,总的来说,它的性能让人信服,也是受欢迎的重要原因。既然Node.js采用单进程,单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Node.js如何利用多核CPU呢?创始人Ryan Dahl建议,运行多个Node.js进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布,后面会详细讲述Node.js在多核CPU下的编程。

Node.js的另一个特点是它支持的编程语言是JavaScript。关于动态语言和静态语言的优缺点比较在这里不在展开讨论。只说三点:

1.JavaScript作为前端工程师的主力语言,在技术社区中有相当的号召力。而且,随着web技术的不断发展,特别是前端的重要性增加,不少前端工程师开始试水“后台应用”,在许多采用Node.js的企业中,工程师都表示因为习惯了JavaScript,所以选择Node.js。

2.JavaScript的匿名函数和闭包特性非常适合事件驱动,异步编程,从helloworld例子中我们可以看到回调函数采用了匿名函数的形式来实现。很方便。闭包的作用则更大,看下面的代码示例:

var hostRequest = http.request(requestOptions,function(response)   {
    var responseHTML = ' ';
    response.on('data', function  (chunk)    {
           responseHTML = responseHTML + chunk;
    });
    response.on('end',function() {
            console.log(responseHTML);
            //    do something   useful
    });
});
 
   

 

 
  

在上面的代码中,我们需要在end事件中处理responseHTML变量,由于JavaScript的闭包特性,我们可以在两个回调函数之外定义responseHTML变量,然后在data事件对应的回调函数中不断修改其值,并最终在end事件中访问处理。

3.JavaScript在动态语言中性能较好,有开发人员对JavaScript,python,Ruby等动态语言做了性能分析,发现JavaScript的性能要好于其他语言,再加上V8引擎也是同类的佼佼者,所以Node.js的性能也受益其中。

5.Node.js发展简史

2009年2月,Ryan Dahl在博客上宣布准备基于V8创建一个轻量级的web服务器并提供一套库。

2009年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node.js包,随后几个月里,有人开始使用Node.js开发应用。

2009年11月和2010年4月,两届JSConf大会都安排了Node.js的讲座。

2010年年底,Node.js获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node.js的发展。

2011年7月,Node.js在微软的支持下发布Windows版本。

6.Node.js&NPM的安装与配置

Node.js安装与配置

  Node.js已经诞生两年有余,由于一直处于快速开发中,过去一些安装配置介绍多数针对0.4x版本而言的,并非适合最新的0.6.X的版本情况了,对此,我们将在0.6.x的版本上介绍Node.js的安装与配置。(本文一律以0.6.1为例,0.6的其余版本,只需替换版本号即可。从http://nodejs.org/#download可以查看到最新的二进制版本和源代码)。

Windows平台下的Node.js安装

  在过去,Node.js一直不支持在Windows平台下原生编译,需要借助Cygwin或MinGW来模拟POSIX系统,才能编译安装。幸运的是2011年6月微软开始与Joyent合作移植Node.js到Windows平台上(http://www.infoq.com/cn/news/2011/06/node-exe),这次合作的成果最终呈现在0.6.x的稳定版的发布上。这次的版本发布使得Node.js在Windows平台上的性能大幅度的提高,使用方面也更容易和轻巧,完全摆脱掉Cygwin或MinGW等实验室式的环境,并且在某些细节方面,表现出比Linux下更高的性能,细节参见http://www.infoq.com/news/2011/11/Nodejs-Windows.

  在Windows(Windows7)平台下,介绍安装Node.js的方法,即普通和文艺安装方法。

普通的安装方法

  普通安装的方法其实就是最简单的方法了,对于大多数Windows用户而言,都是不太喜欢折腾的人,你可以从这里(http://nodejs.org/dist/v0.6.1/node-v0.6.1.msi)直接下载到Node.js编译好的msi文件。然后双击即可在程序的引导下完成安装。

在命令行中直接运行:

node   -v

命令行将打印出:

v0.6.1

该引导步骤会将node.exe文件安装到C:\Program  Files (x86)\nodejs\目录下,并将该目录添加进PATH环境变量。

文艺的安装方法

  在WIndows平台下的文艺安装方法主要提供给那些热爱折腾,喜欢变异的同学们。在编译源码之前需要注意的是你的Windows系统是否包含编译源码的工具。Node.js的源码主要由C++代码和JavaScript代码构成,但是却用gyp工具(http://code.google.com/p/gyp/)来做源码的项目管理,该工具采用Python语言写成的。在Windows平台上,Node.js采用gyp来生成Visual  Studio  Solution文件,最终通过VC++的编译器将其编译为二进制文件。所以,你需要满足以下两个条件:

1.Python (Node.js建议使用2.6或更高版本,不推荐3.0),可以从这里(http://python.org/)获取。

2.VC++编译器,包含在Visual  Studio  2010中(VC++2010  Express 亦可),VS2010可以从这里(http://msdn.microsoft.com/en-us/vstudio/hh388567)找到。

下载Node.js的0.6.1版本的源码压缩包 (http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz)并解压之。

通过命令进入解压的源码目录,执行vcbuild.bat  release命令,然后经历了漫长的等待后,编译完成,在Release目录下可以找到编译好的node.exe文件。通过命令行执行node -v。

命令行返回结果为:

v0.6.1

事实上,如果你的编译环境中存在WIX工具集(http://wix.sourceforge.net/),执行vcbuild.bat  msi release命令,你将会在Relase目录下找到node.msi。

是的,我们回到了一开始的普通安装方法。所谓文艺就是多走一些路,多看一些风景罢了。

7.安装NPM

 NPM的全称是Node  Package  Manager,如果你熟悉ruby的gem,python的PyPL,setuptools,PHP的pear,那么你就知道NPM的作用是什么了。没错,他就是Nodejs的包管理器。Nodejs自身提供了基本的模块。但是在这些基本模块上开发实际应用需要较多的工作。所幸的是笔者执笔此文的时候NPM上已经有了5112个Nodejs库或框架,这些库从各个方面可以帮助Nodejs的开发者完成较为复杂的应用。这些库的数量和活跃也从侧面反映出Nodejs社区的发展是十分神速和活跃的。下面我将介绍安装NPM和通过NPM安装Nodejs的第三方库,以及在大陆的网络环境下,如何更好的利用NPM.

Windows下安装NPM

  由于Nodejs最初在Linux开发下的历史原因,导致NPM一开始也不支持Windows环境,但是随着Nodejs成功移植到WIndows平台,NPM在Windows下的需求亦是日渐增加。下面开始WIndows下的NPM之旅吧。

安装Git工具

由于GitHub网站不支持直接在线下载打包了所有submodule的源码包,所以需要通过git工具来签出所有的源码。

从http://code.google.com/p/msysgit/downloads/list,可以下载到msysgit这个WIndows平台下的git客户端工具(最新版本文件为Git-1.7.7.1-preview20111027.exe),在下载之后双击安装。

下载NPM源码

打开命令行工具(CMD),执行以下命令,可以通过msysgit签出NPM的所有源码和依赖代码并安装npm。

git  clone  --recursive  git://github.com/isaacs/npm.git
cd   npm
node   cli.js install   npm   -gf

在执行这段代码之前,请确保node.exe是跟通过node.msi的方式安装的,或者在PATH环境变量中。这段命令也会将npm加入到PATH环境变量中去,之后可以随处执行npm命令。如果安装中遇到权限方面的错误,请确保cmd命令行工具是通过管理员身份运行的。安装成功后,执行以下命令:

npm   install   underscore

返回:

underscore@1.2.2     ./node_modules/underscore

如此,Windows平台下的NPM安装完毕。如果遭遇网络问题无法安装,请参照Linux下的NPM命令,添加镜像地址。

8.深入Node.js的模块机制

 

转载于:https://www.cnblogs.com/kangwenju/p/10695162.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值