(原文地址 作者: Felix Geisendörfer)
我推荐Node.js给别人,通常得到两种反应:要么恍然大悟,要么感到很困惑。
如果你是第二类人,我尝试着解释一下什么是Node:
- 命令行工具。下载一个打包文件,从源文件编译安装。
- 在终端,通过命令'node my_app.js'运行你的JavaScript程序
- JavaScript由V8 JavaScript引擎执行(就是让Google Chrome 浏览器运行如飞的那个)
- Node 提供了网络和文件系统的JavaScript API
”但是我能用这些语言:ruby,python,php,java,...完成一切工作“!
是的,我知道,你是对的!Node不是独角怪兽(freaking unicorn)能为你完成任何工作。它只是一种工具,可能不会完全替代你通常使用的工具,至少现在是这样。
”切入正题吧!“
好的。你要并行处理一些事情的时候,Node会表现的非常棒。你有没有写过这样的代码”希望能够并行运行“?是的,在Node中,除了源文件[my_app.js]本身,所有的程序都是并行运行的。
”呃?“
对,所有的程序都是并行运行的,除了你的源文件.为了使你明白,打个比方,你的代码是国王,Node是他的佣人大 军(army of servants)。
每天侍从叫醒国王,问国王是否需要什么。国王给侍从任务清单,然后继续睡觉。侍从将任务分配给同事然后开始工作。
一旦有侍从完成了任务,他到国王门前排队报告。国王一次只让一个侍从进入,然后听他报告。有时候,回报完毕,国王可能会给他另外的工作。
生活很美好,因为国王的侍从并行的完成分配的任务,完成一个任务汇报一次,因此国王能够十分专注。*
”那样很棒,可是请别用那个愚蠢的比喻,能以极客的方式告诉我什么事Nodejs吗?“
当然。一个简单的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……你总学过一点JavaScript吧,是么?
最后,速度。V8不断的将动态解释语言的性能推向极致。我不能想象其它任何语言像现在JavaScript一样,气势汹汹的加快执行速度。 而且,node的I/O设施非常轻巧,使你能够最大限度的利用你的系统I/O能力。
“ 你的意思是说我应该用弄得写所有的应用程序了吗?“
是又不是。当你把node当成了一把锤子以后,所有的东西都变成了钉子。如果你在做关于有截止时间的工作,你也许 参考下面的作决定:
- 快速响应、高并发真的对我重要吗?Node真的善于此
- 项目很大吗?小项目更适合。如果是大项目的话就要仔细 衡量 了(可用的库、源码bug或者两者兼有,等等)
”Node运行在windows上面吗?“
不。如果你在windows上面,你需要运行一个虚拟机(我推荐 VirtualBox)来跑linux。node支持
windows已经在计划中了,不过要是你想在未来几个月内屏息等待,那就不可能了,除非你想帮忙移植。
”在node中能使用Dom吗?“
聪明的问题!不能吧,DOM是浏览器上的东西,幸运的是,node‘s的JS引擎(V8)从那个凌乱的地方独立出来了。但是,已经有人将DOM作为一个模块来实现(the DOM as a node module),很有趣吧,可能在服务器端做客户端的单元测试。
”事件驱动的编程很难吗?“
因人而异吧。如果你已经穿越了AJAX和用户事件的荆棘,适应node将不成问题。
不论哪种方式,测试驱动的开发能够真正的可维护的产品。
”谁在使用node呢?“
在wiki上有一个小而且不完全的列表(看”Companies using Node“)。
Yahoo 用node对YUI进行实验1。 Plurk(扑浪)用node来处理大量的comet。PaulBakaus(因jquery UI而名)正在建立一个动人心弦的游戏引擎 ,后台用了node。Joyent 雇佣了Ryan Dahl(node的创建者)大力支持node的开发。
哦,还有Heroku 宣布支持(实验性的)托管node.js
”在哪里能学到更多的东西?“
Tim Caswell 很棒的博客How To Node。 在twitter 上follow #nodejs 。
订阅邮件列表。到IRC来闲逛,#node.js(是的,点号在名字里面)。We're close to hitting the 200 lurker-mark there soon : )【——怎么翻译】
我将继续在这里写文章 debuggable.com.
就这么多了。如果你有问题欢迎评论!
--------------------------分割线-------------------------------
*:显然,比喻太简单了,可是现实中实在难以找到非阻塞概念对应物,这个比喻是一个折中的理解。
1. Whyme.Lyu 指出错误 。原为 “Yahoo 因为YUI很有经验。”