nodejs初步体验篇


Posted in NodeJs onNovember 23, 2015

前言:写这篇文章的由来:

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的使用中起到重要的作用。下面也会介绍下载npm,npm就是模块的管理工具,用它安装各种 Node 的软件包(如express,redis等)并发布自己为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

./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为例:

nodejs初步体验篇

其上几步走完才算把环境搭建完成,可是现在还没有到安装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()中的文本。有图有真相:

nodejs初步体验篇

nodejs初步体验篇

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看到结果

nodejs初步体验篇

现在Node社区中已有不少第三方的模块,希望能有更多人通过学习Node,加入到这个大家庭中,为Node社区来添砖加瓦。先谢谢之,咱们继续。

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

var name = "Darren";
this.location = "Beijing";

this.showLog = function(){

 console.log('Hi Darren.')

};

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

nodejs初步体验篇

结果高亮的地方很清楚的告诉我们,私有方法我们在模块以外是取不到的,所以是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');

nodejs初步体验篇

所谓的异步,大家应该都能想得到运行时会先打先显示"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就被删除了,就是这么简单

nodejs初步体验篇

这只是一个简单的例子,感兴趣的话自己去多多尝试,实践出真理。由于篇幅原因就不多举例了。^_^

学习Node的总结:

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

2.理解了服务端JavaScript的一个成功框架-Node,以及它的一些优势和使用的方式,这篇文章就是最好的总结,当然,这只会是一个开始。

3.对于没有进入那么梦想的公司其实是有那么点遗憾,不过生活就应该要这样,有波折有起伏,这正是我需要并且期待的...那么新的生活还是要继续,做自己的舵手,把握好自己的方向,过去的就让它过去吧。

一些想对大伙说的话:

1. 在这我得打击一部分人的积极性。假如你对后台技术不够了解或者没接触过服务端语言,不知道I/O这些知识,没有后台处理流程这种概念,那么......Node并不是一门适合入门的服务端技术。为什么这么说:

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

nodejs初步体验篇

 b.对没有经验的朋友来说node其实并不好上手,从最简单“Hello world”就可以看出来(各种运行环境和安装细节的了解都得费点功夫),不要以jQuery库为比较,所处理的事物不同,学习的成本也不同 - 所以不太建议作为新手入门的服务端技术,如果想学习一门服务端语言PHP和Python都是不错的选择,因为:书多 例子多 框架多 上手简单 容易理解 搭建方便...

 c.以上都是我个人善意的建议,由于水平有限,请大家多多指教,希望嘴下留情。

2. 关于Node的书写规范和具体技巧本人就不献丑了,自己写Node的代码也不多,不过面向对象的编程思想在哪都是好使的。

以上内容是小编给大家介绍的nodejs初步体验篇,希望大家喜欢。

NodeJs 相关文章推荐
NodeJS 模块开发及发布详解分享
Mar 07 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
Nodejs初级阶段之express
Nov 23 #NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 #NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 #NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 #NodeJs
浅谈Nodejs观察者模式
Oct 13 #NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 #NodeJs
nodejs创建web服务器之hello world程序
Aug 20 #NodeJs
You might like
利用js调用后台php进行数据处理原码
2006/10/09 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
jquery 笔记 事件
2011/11/02 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Python时间获取及转换知识汇总
2017/01/11 Python
用python与文件进行交互的方法
2018/03/01 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
解决方案设计综合面试题
2015/08/31 面试题
酒店开业策划方案
2014/06/02 职场文书
在职员工证明书
2014/09/19 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
资料员岗位职责
2015/02/10 职场文书
2016年教代会开幕词
2016/03/04 职场文书
2016春季运动会开幕词
2016/03/04 职场文书