转载自http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb
当我向人们介绍node.js时,通常会得到两种反应,一种人马上就能了解,另一种则是非常困惑。
如果你是第二种人,请看一下我对node的解释:
- 它是一个命令行工具。你可以通过下载源码压缩包,编译并安装;
- 它能让你在你的终端上运行JavaScript程序,只需要输入"node my_app.js";
- V8 javascript引擎(Google Chrome的脚本引擎,保证了Chrome的快速运行)负责执行JS文件;
- Node 提供了一个JavaScript API用于访问网络和文件系统。
“但是我用ruby、python、php、java……就可以做所有的事情了!”
我知道。一点也没错!Node并没有神奇到可以帮你完成你的工作,抱歉。它只是一个工具,而它至少现在还不足以完全取代你惯用的工具。
“说重点!”
好的。当你需要同时做几件事情的时候,Node是很好用的。你有没有写过一段代码然后说:”我希望这个可以并行运行“?在node里一切都可以并行运行,除了你的代码。
“啥?”
是的,除了你的代码,一切都可以并行运行。想象一下你的代码是国王,node是他的侍从们。
一个侍从把国王叫醒,看看他有什么需要。国王交给侍从一系列任务后就回去睡觉了。侍从把任务分配给他的同事,大家开始工作了。
一旦某一个侍从完成了一个任务,他就进入一个队列等待向国王报告。国王依次接受每个侍从的报告。有时国王会在听完报告后给侍从更多的任务。
虽然侍从们可以并行地完成任务,但是每次只能报告一个结果,以便让国王保持专注。
“那很棒,不过能不能停止这个愚蠢的比喻,说点专业的?”
当然。一个简单的node程序如下:
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了。一旦node完成一个任务,就调用回调函数。但是每次只能调用一个回调函数。在该回调函数执行完之前,其他回调函数必须排队等待。此外,我们无法确定回调函数的执行顺序。
“所以我不用担心数据的并发访问问题?”
对!这正是JavaScript单线程和事件循环设计的美妙之处。
“很好,但我为啥要用它?”
一个原因是执行效率。在一个web应用中,你的总响应时间通常是数据库查询时间的总和。使用node,你可以同时进行所有的查询,将响应时间减少到执行最慢查询的时间。
另一个原因是Javascript。你可以使用node实现浏览器和后端共享代码。JavaScript正在逐步成为一个通用编程语言。无论你过去使用python、ruby、java还是php……你或多或少都用过JS,不是吗?
最后一个原因是运行速度。V8正在持续地提高运行速度以成为最快的动态语言解释器之一。我找不到任何其他语言像JavaScript这样如此激进地提高运行速度。此外,node的I/O工具非常地轻,使你可以尽可能完全利用系统的I/O能力。
“所以你是说将来我应该一直用node编写我的所有程序?”
是又不是。只使用一种编程语言和工具会让我们的眼光变得狭窄。(原文:当你开始挥舞node大锤时,一切事物在你眼里都像是一个钉子)但是如果你面临某个任务的deadline时,你可以基于如下的分析进行选择:
- 低响应时间和高并发是否重要?Node非常擅长这个;
- 工程的规模有多大?小工程还好。大工程则需要认真评估。(可用的库,修正bug和并行开发的资源等)
“node可以在Windows上运行么?”
不行,如果你用的是windows,你需要运行linux的虚拟机。支持Windows是node的开发计划之一。但是不要为此而等待。(PS:这篇文章是2010年写的,现在已经有支持windows的node了)
“我可以通过node访问DOM么?”
好问题!不行,DOM是浏览器的一个接口,node的JS引擎(V8)则完全从那些混乱中分离出来了。但是,有些人在实现DOM的node模块,这将使浏览器端代码的单元测试成为可能。
“事件驱动编程不是很难么?”
这取决于你过去的经验了。如果你已经学过浏览器的AJAX调用和用户事件模型,那么使用node完全不是问题。另外,测试驱动开发可以帮助你进行可维护的设计。
“谁在用node?”
这是一个不完整清单。node wiki(滚动到"Companies using Node")Yahoo正在尝试将node用在YUI上,Plurk正在使用它做大规模评论(原文:massive comet,怀疑是笔误),Paul Bakaus(jQUery UI作者)正在制作一个牛逼的游戏引擎,其中在后端用到了node。Joyent聘请了Ryan Dahl(node创始人)并让其担任主要开发。
噢,Heroku刚宣布支持node.js主机。
“我去哪了解更多信息?”
Time Caswell 的博客How To Node。在twitter上Follow#nodejs。订阅这些邮件清单。加入IRC channel, #node.js。
此外,我也将继续在debuggable.com发表文章。