现在那个网站做推广效果会好点,网页制作图片大小设置,设计师服务平台破解,江苏省数字文化馆网站建设转载自#xff1a;http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 最近写的文章收到许多朋友的反馈#xff0c;感谢大家的支持和建议#xff0c;让我对坚持写博客充满热情#xff0c;一个月一篇文章确实有点少#xff0c;所以以后尽力多做分享#…转载自http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 最近写的文章收到许多朋友的反馈感谢大家的支持和建议让我对坚持写博客充满热情一个月一篇文章确实有点少所以以后尽力多做分享做好的分享希望能对朋友们有用。 到新公司的这段时间学到了很多新东西有好多东西需要去总结去探索不过事情得一件一件来今天咱们先从Node开始。注以后出现的Node即node.js。 先搞点前戏热热场 - 为什么写这篇文章 1.前段时间单位有新项目启动服务端要做的工作不多也不算麻烦就是处理一些中间层的服务而且我们团队里面个个都会JavaScript领导就决定试试服务器端的JavaScript结果本人有幸被派去研究了几天Node怀着鸡冻的心情开始了node.js的篇章这篇文章也就是为这几天研究的总结。 2.一个JavaScript工程师如果没听过node.js那么我想你是不是错过了什么每个优秀的前端工程师都有必要去了解后台处理流程那么如果又能从JavaScript出发岂不是一件很美妙的事么。 3.互联网的火热使得JavaScript风光无限且服务端的JavaScript也并不是什么新技术了相关的框架也有不少只是node.js的成功让他爆发式的出现在我们的视线中让很多前端工程师看到了从前端写到后端的另一种实现希望。注node.js 是一个允许开发人员使用 JavaScript 语言编写服务器端代码的框架。 4.今年8月曾在某大公司最后一轮(第五轮)的面试被问到Node.js的问题相对应的回答那是相当之糟糕结果怎样你们懂的感觉这个问题是导致没有通过的关键点之一...那家公司是我在读大学的时候就无比向往的公司现在回想起那次经历和过程谈不上惋惜毕竟我真的尽力了 - 其实这篇文章更多的也是为了完成自己一个小小的心结...好吧又扯远了。 5.欢迎各种转载不过请注明出处谢谢。 Node是个啥 写个东西还是尽量面面俱到吧所以有关基本概念的东西我也从网上选择性的拿了些下来有些地方针对自己的理解有所改动对这些概念性的东西有过了解的可选择跳过这段。 1.Node 是一个服务器端 JavaScript 解释器可是真的以为JavaScript不错的同学学习Node就能轻松拿下那么你就错了总结水深不深我还不知道不过确实不浅。 2.Node 的目标是帮助程序员构建高度可伸缩的应用程序编写能够处理数万条同时连接到一个物理机的连接代码。处理高并发和异步I/O是Node受到开发人员的关注的原因之一。 3.Node 本身运行Google V8 JavaScript引擎所以速度和性能非常好看chrome就知道而且Node对其封装的同时还改进了其处理二进制数据的能力。因此Node不仅仅简单的使用了V8还对其进行了优化使其在各种环境下更加给力。什么是V8 JavaScript 引擎请“百度知道” 4.第三方的扩展和模块在Node的使用中起到重要的作用。下面也会介绍下载npmnpm就是模块的管理工具用它安装各种 Node 的软件包(如expressredis等)并发布自己为Node写的软件包 。 安装Node 在这简单说说在window7和linux两种环境下安装Node。安装的时候一定要注意Python的版本多次因为Python版本的问题安装失败建议2.6的版本低版本会出现Node安装错误查询Python版本可在终端中输入pyhton -v 1.先介绍linux下的安装吧Node在Linux环境下的安装和使用都非常方便建议在Linux下运行Node^_^...我使用的是Ubuntu11.04 a.安装依赖包50-100kb/s大概每个包一分钟就能下载安装完成 sudo apt-get install g curl libssl-dev apache2-utils sudo apt-get install git-core b.在终端一步步运行一下命令 git clone git://github.com/joyent/node.git cd node./configuremake 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 compilergcc-mingw-g: Mingw32 support headers and libraries for GCC Cgcc4-g: G subpackagegit: Fast Version Control System – core filesmake: The GNU version of the ‘make’ utilityopenssl-devel: The OpenSSL development environmentpkg-config: A utility used to retrieve information about installed librarieszlib-devel: The zlib compression/decompression library (development)Editor包vim: Vi IMproved – enhanced vi editorPython包把Default切换成install状态即可Web包wget: Utility to retrieve files from the WWW via HTTP and FTPcurl: Multi-protocol file transfer command-line tool 上个截图以下载zlib-devel为例 其上几步走完才算把环境搭建完成可是现在还没有到安装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以及它的一些优势和使用的方式这篇文章就是最好的总结当然这只会是一个开始。 3.对于没有进入那么梦想的公司其实是有那么点遗憾不过生活就应该要这样有波折有起伏这正是我需要并且期待的...那么新的生活还是要继续做自己的舵手把握好自己的方向过去的就让它过去吧。 一些想对大伙说的话 1. 在这我得打击一部分人的积极性。假如你对后台技术不够了解或者没接触过服务端语言不知道I/O这些知识没有后台处理流程这种概念那么......Node并不是一门适合入门的服务端技术。为什么这么说 a.重点就是中文实例少文章少想系统的学习会比较麻烦所以在使用过程中总有一种不成熟的感觉当然主要还是因为我对它不熟悉所造成的。国内使用Node的公司确实不多当然国外还是有不少了从cnodejs.org截了一个图 b.对没有经验的朋友来说node其实并不好上手从最简单“Hello world”就可以看出来(各种运行环境和安装细节的了解都得费点功夫)不要以jQuery库为比较所处理的事物不同学习的成本也不同 - 所以不太建议作为新手入门的服务端技术如果想学习一门服务端语言PHP和Python都是不错的选择因为书多 例子多 框架多 上手简单 容易理解 搭建方便... c.以上都是我个人善意的建议由于水平有限请大家多多指教希望嘴下留情。 2. 关于Node的书写规范和具体技巧本人就不献丑了自己写Node的代码也不多不过面向对象的编程思想在哪都是好使的。 3. 希望这篇文章能对大家学习Node有用如果觉得这文章也算用心请劳驾点右下角的推荐。 推荐几个学习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 注最终领导决定放弃Node而使用Python可是这不会影响我对Node的喜爱。我说过这篇文章只会是一个开始。 作者聂微东 出处http://www.cnblogs.com/Darren_code/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 分类: JavaScript/jQuery 标签: node.js 转载于:https://www.cnblogs.com/yang3wei/archive/2012/09/18/2739609.html