关于Node.js的总结

Node是个啥?  javascript

  1.Node 是一个服务器端 JavaScript 解释器,但是真的觉得JavaScript不错的同窗学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅。html

  2.Node 的目标是帮助程序员构建高度可伸缩的应用程序,编写可以处理数万条同时链接到一个物理机的链接代码。处理高并发和异步I/O是Node受到开发人员的关注的缘由之一。java

  3.Node 自己运行Google V8 JavaScript引擎,因此速度和性能很是好,看chrome就知道,并且Node对其封装的同时还改进了其处理二进制数据的能力。所以,Node不只仅简单的使用了V8,还对其进行了优化,使其在各类环境下更加给力。(什么是V8 JavaScript 引擎?请“百度知道”)node

  4.第三方的扩展和模块在Node的使用中起到重要的做用。下面也会介绍下载npm,npm就是模块的管理工具,用它安装各类 Node 的软件包(如express,redis等)并发布本身为Node写的软件包 。linux

 

安装Nodegit

  在这简单说说在window7和linux两种环境下安装Node。安装的时候必定要注意Python的版本,屡次由于Python版本的问题安装失败,建议2.6+的版本,低版本会出现Node安装错误,查询Python版本可在终端中输入:pyhton -v 程序员

  1.先介绍linux下的安装吧,Node在Linux环境下的安装和使用都很是方便,建议在Linux下运行Node,^_^...我使用的是Ubuntu11.04github

   a.安装依赖包:50-100kb/s大概每一个包一分钟就能下载安装完成web

  sudo apt-get install g++ curl libssl-dev apache2-utils    sudo apt-get install git-core

   b.在终端一步步运行一下命令:redis

  git clone git://github.com/joyent/node.git    cd node   ./configure   make    sudo make install

  安装顺利的话到这一步Node就算安装成功了,2M的网络用了共计12分钟。

  注:若是不用git下载也能够直接下载源码,不过这样下载安装须要注意Node版本问题。使用git下载安装是最方便的,因此推荐之。

 

  2.在Windows下使用Cygwin安装Node,这个方式不太推荐,由于真的须要较长时间和较好的人品。个人系统是 win7旗舰版

  Cygwin是一个在windows平台上运行的unix模拟环境,下载地址:http://cygwin.com/setup.exe

  下载好Cygwin后开始安装,步骤:

   a.选择下载的来源 - Install from Internet

   b.选择下载安装的根目录

   c.选择下载文件所存放的目录

   d.选择链接的方式

   e.选择下载的网站 - http://mirrors.163.com/cygwin

   f.麻烦就麻烦在这步,考验人品的时候到了。须要的下载安装时间不肯定,反正须要比较长的时间(超过20分钟),偶尔会出现安装失败的状况。单击一下各个程序包前面的旋转箭头图标选择你想要的版本,选中时会出现了"x"号表示已经选中了该程序包。选择须要下载的程序包:

复制代码
  Devel包:     gcc-g++: C++ compiler     gcc-mingw-g++: Mingw32 support headers and libraries for GCC C++     gcc4-g++: G++ subpackage     git: Fast Version Control System – core files     make: The GNU version of the ‘make’ utility     openssl-devel: The OpenSSL development environment     pkg-config: A utility used to retrieve information about installed libraries     zlib-devel: The zlib compression/decompression library (development)   Editor包:vim: Vi IMproved – enhanced vi editor   Python包:把Default切换成install状态便可   Web包:     wget: Utility to retrieve files from the WWW via HTTP and FTP     curl: Multi-protocol file transfer command-line tool
复制代码

  上个截图,如下载zlib-devel为例:

    cygwin例子

  其上几步走完才算把环境搭建完成,但是如今尚未到安装Node,还须要在Cywgin的ASH模式下执行rebaseall,步骤以下:

   a. cmd命令行

   b. 进入cygwin安装目录下的bin子目录

   c. 运行ash进入shell模式

   d. ./rebaseall -v

   e. 没有错误就关闭命令行窗口   好了,如今到下载安装Node了,启动Cygwin.exe后输入:

复制代码
  $ wget http://nodejs.org/dist/node-v0.4.12.tar.gz   $ tar xf node-v0.4.12.tar.gz   $ cd node-v0.4.12   $ ./configure   $ make   $ make install
复制代码

 

  3.直接下载node.exe文件

  nodejs.org下载较慢因此我在网盘上传了一个,下载地址:http://www.everbox.com/f/VhyL6EiGF5Lm3ZSRx85caFDIA5

  据说有不太稳定的问题,不过你假如只是想先在windows下了解Node,我的感受这个方法比你装个Cygwin好不少。

 

  注:本来不太想写安装Node这段,但是为了这篇文章的全面性仍是写了,没想到一写就是那么长一段了...茶几了

 

“Hello World” - 为何每次见到这句心情都会小激动,不解...

  首先,建立个hello.js的文件,在文件中copy以下代码:

复制代码
  var http = require('http');   http.createServer(function (req, res) {    res.writeHead(200, {'Content-Type': 'text/plain'});    res.end('Hello World\n');   }).listen(1337, "127.0.0.1");   console.log('Server running at http://127.0.0.1:1337/');
复制代码

  代码逻辑:

   a. 全局方法require()是用来导入模块的,通常直接把 require() 方法的返回值赋值给一个变量,在 JavaScript 代码中直接使用此变量便可 。require("http") 就是加载系统预置的 http 模块

   b. http.createServer 是模块的方法,目的就是建立并返回一个新的web server对象,而且给服务绑定一个回调,用以处理请求。

   c. 经过 http.listen() 方法就可让该 HTTP 服务器在特定端口监听。

   d. console.log就不用多说了,了解firebug的都应该知道,Node实现了这个方法。

    注: 想了解具体细节请查看文档 cnodejs.org/cman/all.html#http.createServer

  接着运行Node服务器,执行hello.js代码,成功启动会看见console.log()中的文本。有图有真相:

  

  

 

npm的下载和使用

  除Node自己提供的API外,如今有很多第三方模块可极大的提升开发效率,npm就是Node的软件包管理器,能够用它安装所需软件包并发布本身为nodejs写的软件包。官网地址:npmjs.org

  安装只须要在终端写入一行代码:    

  curl http://npmjs.org/install.sh | sh

  npm安装node扩展包一样是一行代码:  

  npm install <包名>    //例:npm install express

  注:若是安装模块的过程当中报域名错误的话,请清空缓存 >npm cache clean 或重启计算机便可。

  

理解Node的模块概念

  在Node中,不一样的功能组件被划分红不一样的模块。应用能够根据本身的须要来选择使用合适的模块。每一个模块都会暴露一些公共的方法或属性。模块的使用者直接使用这些方法或属性便可,对于内部的实现细节就能够不用了解。除了Node自己提供的API外,开发人员也能够利用这个机制来将应用拆分红多个模块,以提升代码的可复用性。

  1.如何使用模块?

  在Node中使用模块是很是方便的,在 JavaScript 代码中能够直接使用全局函数 require() 来加载一个模块。

  在刚刚”Hello World"的例子中,require("http") 能够加载系统预置的 http 模块;模块名称以 "./" 开始的,如 require("./myModule.js") 用来加载与当前 JavaScript 文件同一目录下的 myModule.js 模块。

  2.本身如何开发模块?

  刚刚介绍使用require()导入模块的时候,模块名称以 "./" 开始的这种,就是本身开发的模块文件。须要注意的就是JS文件的系统路径。

  代码中封装了模块的内部处理逻辑,一个模块通常都会暴露一些公开的方法或属性给其余的人使用。模块的内部代码须要把这些方法或属性给暴露出来。

  3.来一套简单的例子。先建立一个模块文件如myModule.js,就一行代码

  console.log('Hi Darren.')

  而后建立一个test.js文件,导入这个JS文件,执行node看到结果

  如今Node社区中已有很多第三方的模块,但愿能有更多人经过学习Node,加入到这个你们庭中,为Node社区来添砖加瓦。先谢谢之,我们继续。  

  4.来一个深点的例子。这个例子中将会针对 私有和共有 进行介绍。先建立一个myModule.js,代码以下:

  var name = "Darren";   this.location = "Beijing";   this.showLog = function(){    console.log('Hi Darren.')   };

  代码中出现了三种类型,分别是: 私用属性,共有属性和共有方法,再建立一个test.js,执行Node

  结果高亮的地方很清楚的告诉咱们,私有方法咱们在模块之外是取不到的,因此是undefined。共有属性和共有方法的声明须要在前面加上 this 关键字。

 

Node能作什么和它的优点

  Node核心思想:  1.非阻塞;  2.单线程;  3.事件驱动

  在目前的web应用中,客户端和服务器端之间有些交互能够认为是基于事件的,那么AJAX就是页面及时响应的关键。每次发送一个请求时(无论请求的数据多么小),都会在网络里走一个来回。服务器必须针对这个请求做出响应,一般是开辟一个新的进程。那么越多用户访问这个页面,所发起的请求个数就会愈来愈多,就会出现内存溢出、逻辑交错带来的冲突、网络瘫痪、系统崩溃这些问题。

  Node的目标是提供一种构建可伸缩的网络应用的方案,在hello world例子中,服务器能够同时处理不少客户端链接。

  Node和操做系统有一种约定,若是建立了新的连接,操做系统就将通知Node,而后进入休眠。若是有人建立了新的连接,那么它(Node)执行一个回调,每个连接只占用了很是小的(内存)堆栈开销。    

  举一个简单的异步调用的例子,把test.js和myMydule.js准备好了,^_^。把如下代码拷贝到test.js中并执行:

复制代码
  var fs = require('fs');   fs.readFile('./myModule.js', function (err, data) {     if (err) throw err;     console.log('successfully');   });   console.log('async');
复制代码

  所谓的异步,你们应该都能想获得运行时会先打先显示"async",再显示"successfully"。

  Node是无阻塞的,新请求到达服务器时,不须要为这个请求单独做什么事情。Node仅仅是在那里等待请求的发生,有请求就处理请求。

  Node更擅长处理体积小的请求以及基于事件的I/O。

  Node不只仅是作一个Web服务的框架,它能够作更多,好比它能够作Socket服务,能够作比方说基于文件的,而后基于像一些比方说能够有子进程,而后内部的,它是一个很完整的事件机制,包括一些异步非注射的解决方案,而不只仅局限在网络一层。同时它可能,即便做为一个Web服务来讲,它也提供了更多能够深刻这个服务内核、核心的一些功能,比方说Node使用的Http Agent,这块就是它能够更深刻这个服务内核来去作一些功能。

 

Node事件流概念

  由于Node 采用的是事件驱动的模式,其中的不少模块都会产生各类不一样的事件,可由模块来添加事件处理方法,全部可以产生事件的对象都是事件模块中的 EventEmitter 类的实例。代码是全世界通用的语言,因此咱们仍是用代码说话:

复制代码
  var events = require("events");   var emitter = new events.EventEmitter();   emitter.on("myEvent", function(msg) {     console.log(msg);   });   emitter.emit("myEvent", "Hello World.");
复制代码

  简单的分析这段:

   1. 使用require()方法添加了events模块并把返回值赋给了一个变量

   2. new events.EventEmitter()这句建立了一个事件触发器,也就是所谓的事件模块中的 EventEmitter 类的实例

   3. on(event, listener)用来为某个事件 event 添加事件处理方法监听器

   4. emit(event, [arg1], [arg2], [...]) 方法用来产生事件。以提供的参数做为监听器函数的参数,顺序执行监听器列表中的每一个监听器函数。

 

  EventEmitter 类中的方法都与事件的产生和处理相关:

   1. addListener(event, listener) 和 on(event, listener) 这两个方法都是将一个监听器添加到指定事件的监听器数组的末尾

   2. once(event, listener) 这个方法为事件为添加一次性的监听器。该监听器在事件第一次触发时执行,事后将被移除

   3. removeListener(event, listener) 该方法用来将监听器从指定事件的监听器数组中移除出去

   4. emit(event, [arg1], [arg2], [...]) 刚刚提到过了。

  在Node中,存在各式各样不一样的数据流,Stream(流)是一个由不一样对象实现的抽象接口。例如请求HTTP服务器的request是一个流,相似于stdout(标准输出);包括文件系统、HTTP 请求和响应、以及 TCP/UDP 链接等。流能够是可读的,可写的,或者既可读又可写。全部流都是EventEmitter的实例,所以能够产生各类不一样的事件。

  可读流主要会产生如下事件:

  • data   当读取到流中的数据时,此事件被触发
  • end   当流中没有数据可读时,此事件被触发
  • error   当读取数据出现错误时,此事件被触发
  • close   当流被关闭时,,此事件被触发,但是并非全部流都会触发这个事件。(例如,一个链接进入的HTTP request流就不会触发'close'事件。)

  还有一种比较特殊的 fd 事件,当在流中接收到一个文件描述符时触发此事件。只有UNIX流支持这个功能,其余类型的流均不会触发此事件。

  相关详细文档:http://cnodejs.org/cman/all.html#events_

 

强大的File System 文件系统模块

  Node 中的 fs 模块用来对本地文件系统进行操做。文件的I/O是由标准POSIX函数封装而成。须要使用require('fs')访问这个模块。全部的方法都提供了异步和同步两种方式。

  fs 模块中提供的方法能够用来执行基本的文件操做,包括读、写、重命名、建立和删除目录以及获取文件元数据等。每一个操做文件的方法都有同步和异步两个版本。

  异步操做的版本都会使用一个回调方法做为最后一个参数。当操做完成的时候,该回调方法会被调用。而回调方法的第一个参数老是保留为操做时可能出现的异常。若是操做正确成功,则第一个参数的值是 null 或 undefined 。

  同步操做的版本的方法名称则是在对应的异步方法以后加上一个 Sync 做为后缀。好比异步的 rename() 方法的同步版本是 renameSync() 。下面列出来了 fs 模块中的一些经常使用方法,都只介绍异步操做的版本。

  test.js和myModule.js文件准备好了木?把下面这段代码copy到test.js中执行一次

  var fs = require('fs');   fs.unlink('./myModule.js', function (err) {     if (err) throw err;     console.log('successfully deleted myModule.js');   });

  若是没有报error,那么myModule.js就被删除了,就是这么简单

  

  这只是一个简单的例子,感兴趣的话本身去多多尝试,实践出真理。因为篇幅缘由就很少举例了。^_^

 

学习Node的总结:

  1.对于一个linux的命令和shell知识几乎为零的我来讲,这段时间又学到了很多关于linux知识;vim真是一个强大的编辑器,不用鼠标的感受真的很好;并且有一点对我来讲很重要,在linux下编程很cool,尤为是在团队中都是使用windows的,装装更健康^_^。

  2.理解了服务端JavaScript的一个成功框架-Node,以及它的一些优点和使用的方式。

 

一些想对大伙说的话:

  1. 假如你对后台技术不够了解或者没接触过服务端语言,不知道I/O这些知识,没有后台处理流程这种概念,那么......Node并非一门适合入门的服务端技术

   a.重点就是中文实例少,文章少,想系统的学习会比较麻烦,因此在使用过程当中总有一种不成熟的感受,固然主要仍是由于我对它不熟悉所形成的。国内使用Node的公司确实很少,固然国外仍是有很多了,从cnodejs.org截了一个图:

    

   b.对没有经验的朋友来讲node其实并很差上手,从最简单“Hello world”就能够看出来(各类运行环境和安装细节的了解都得费点功夫),不要以jQuery库为比较,所处理的事物不一样,学习的成本也不一样 - 因此不太建议做为新手入门的服务端技术,若是想学习一门服务端语言PHP和Python都是不错的选择。

  

 推荐几个学习Node的网址:   http://nodejs.org/   

  http://cnodejs.org/   由淘宝人创建的社区,内有Node中文文档

  http://www.oschina.net/p/nodejs/

  http://www.ibm.com/developerworks/cn/opensource/os-nodejs/index.html

相关文章
相关标签/搜索