Node是个啥?
写个小东西还是尽可能乌祖埃吧,因此有关基本原理的小东西我也从网路上特异性地拿了留下来,有些地方特别针对他们的认知略有更动,对这些实验性的小东西有过介绍的可选择埃唐佩县那段。
1.Node 是两个服务端 JavaScript 正则表达式,可是吗误以为JavaScript极好的老师自学Node就能随心所欲夺下,那么你就错了,归纳:潮差不深我还不晓得,不过的确不浅。
2.Node 的最终目标是协助开发人员构筑度可伸缩式的插件,撰写能够处置Minervois与此同时相连到两个力学机的相连标识符。处置高mammalian和触发器I/O是Node受到开发者的关注的原因之一。
3.Node 这类运转Google V8 JavaScript发动机,因此速率和操控性十分好,看chrome就晓得,而且Node对其PCB的与此同时还改良了其处置十进制数据的能力。因此,Node更为重要单纯的采用了V8,还对其进行了强化,使其在各式各样自然环境下更为烦人。(甚么是V8 JavaScript 发动机?请“腾讯晓得”)
4.服务器端的扩充和组件在Node的采用中起著重要的作用。上面也会如是说浏览npm,npm就是组件的管理软件,用它加装各式各样电子设备 Node 的应用软件(如express,redis等)mammalian布他们为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 installg++ curl libssl-dev apache2-utils sudo apt-get install git-coreb.在终端产品一步步运转一下命令:
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.
b.选择浏览加装的根目录
c.选择浏览文件所存放的目录
d.选择相连的方式
e.选择浏览的网站 –
http://mirrors.163.com/cygwinf.麻烦就麻烦在这步,考验人品的时候到了。需要的浏览加装时间不确定,反正需要比较长的时间(超过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为例:
其上几步走完才算把自然环境搭建完成,可是现在还没有到加装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 install3.直接浏览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实现了这个方法。
接着运转Node服务器,执行hello.js标识符,成功启动会看见console.log()中的文本。有图有真相:
npm的浏览和采用
除Node这类提供的API外,现在有不少第三方组件可极大的提高开发效率,npm就是Node的应用软件管理器,可以用它加装所需应用软件mammalian布他们为nodejs写的应用软件。官网地址:npmjs.org
加装只需要在终端产品写入一行标识符:
curlhttp://npmjs.org/install.sh | shnpm加装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文件的系统路径。
标识符中PCB了组件的内部处置逻辑,两个组件一般都会暴露一些公开的方法或属性给其他的人采用。组件的内部标识符需要把这些方法或属性给暴露出来。
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和myModule.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 = newevents.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流支持这个功能,其他类型的流均不会触发此事件。
强大的File System 文件系统组件
Node 中的 fs 组件用来对本地文件系统进行操作。文件的I/O是由标准POSIX函数PCB而成。需要采用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的标识符也不多,不过面向对象的编程思想在哪都是好使的。