Understanding Node.js
原文地址如下:
没有逐字逐句翻译,最后几个问题就没翻译了,大概看了下,对于理解node.js实在是没多大用。
每当我向别人介绍Node.js时,人们一般会有两种反应,一种是“兄弟我已经懂了,你不用解释了”,而另外一种就是“兄弟, 你说的这玩意到底是啥?用来干什么的?”。如果你属于后面一种情况,那么我将会给你解释下面的几点:
(1)Node.js是一个命令行工具。你可以下载它的源代码压缩包,编译、安装。(这里指的是在Linux环境下,在Windows平台已经有可以安装的exe文件了)
(2)在你的终端上你可以用“node my_app.js”这种方式来运行JS代码了(这里所谓的终端是指Linux下的Terminal,在Windows下就是DOS窗口了)
(3)JS代码是被Google的V8 Javascript Engine执行的
(4)Node提供了访问文件和网络的JS API
好了,接下来你会有一些疑问:“你说的上面这些我在ruby、python、php、java中都可以做到,为什么我还需要node?”
你说的一点都没错,而node并不是用来替代这些工具的,至少目前看来没有这个打算。
“说重点!”
Node适合应用在同一时间对多个任务进行处理的场景,node里面的每一样东西都以并行的方式在运行,除了你的代码!
“啊?这是什么意思?”
要理解“node里面的每一样东西都以并行的方式在运行,除了你的代码!”这句话的意思,你可以把你的代码想象成一个国王,而node只是侍奉他的仆人们。每天一天亮,就会有一个仆人叫醒国王,然后询问国王是否需要服务。国王列了一些任务给仆人,然后倒头继续补会儿觉。这位仆人把国王的任务分发给他的同事,然后他们开始执行国王的任务。
一旦有一个仆人完成了他的任务,Once a servant finishes a task, he lines up outside the kings quarter to report.国王每次只让一名仆人汇报,有时候,国王会在仆人汇报完毕后有派发给他更多的任务。国王的美好生活就是这样运行的,他的仆人们同时在执行任务,而每次却只让一名仆人汇报任务结果,这样国王就可以集中注意力。
“这个故事听起来很棒,但是你可以用Geek的方式来给我们演示一下吗?”
没问题,下面是一份简单的例子:
var fs = require('fs') , sys = require('sys'); fs.readFile('treasure-chamber-report.txt', function(report) { sys.puts("oh, look at all my money: "+report); }); fs.writeFile('letter-to-princess.txt', '...', function() { sys.puts("can't wait to hear back from her!"); });
你的代码分发了两个任务给node,一个是读文件,一个是写文件,你的代码在分发完这两个任务之后就去睡觉了(该进程进入sleep状态,不理解的去google操作系统进程状态)。一旦node完成了一项工作,就会调用回调函数,但是同一时刻只能回调一个函数,直到该回调函数执行完毕,才会轮到其它回调函数。这里需要注意的是,回调函数的调用次序是无序的,不保证首先注册的就先被调用。
“所以,我就没有必要担心我的代码会在同一时刻同时访问数据?”
没错。这里就体现出来JS的单线程/事件轮训机制的美妙之处了。
“非常棒,但是我为什么要用node呢?”
一条理由就足够了,在WEB应用中,主要的耗时是集中在后台查询数据库上,在node里,你可以一次执行所有的数据库查询,可以减少消耗在慢查询上的响应时间。
另外一个使用node的理由就是,你可以复用前后台的代码,JS正慢慢成为一种通用的编程语言,不管你曾经是做ruby、python、php还是java等,今后你可能都会需要用到JS。
最后一个理由就是速度。目前V8引擎是在这个星球上最快的动态语言解释器,其它的动态语言解释器难以超越。除此之外,node的I/O组件是真正轻量级的,让你可以尽可能地充分发挥利用系统I/O的能力。
“听起来,你的意思就是从现在起我所有的APP都应该基于node?”
是的,也可以说不是的。一旦你用起了node,你就会慢慢喜欢、适应它。但是如果你现在手头的项目快到期了,那么如何评估你是否需要node呢?可以基于下面两个点:
(1)快速响应/高并发对于你的项目来说是否非常重要?node很适于这两点
(2)你的项目有多大?node适合小项目,大项目的话需要非常仔细地评估。
“node可以运行在Windows平台吗?”
现在是可以的,原文作者写这篇文章的时候还不可以。
“我能在node里面访问DOM吗?”
不可以,DOM是浏览器里面的东西,但是有人正在开发,把DOM作为一个node的模块。
“事件驱动编程是不是真的很难?”
这取决于你自己了,如果你习惯了AJAX调用和浏览器中的事件,那么这就不是问题。另外,测试驱动开发有助于你维护项目。