理解node.js

1814 查看

最近在学习node.js,这篇文章是Felix Geisendorfer写的,很有典型意义,这里把大部分文章翻译了一下,原文可以猛戳这里

--------------------------翻译在下面---------------------------------

理解node.js

在我介绍Node.js的人群中,大致产生了两种反应。要么正确理解,要么就被搞糊涂了。 如果你现在还是第二类人群,这是我试图对node做的解释:

  • 这是一个命令行工具。你下载好tar压缩包,编译并且安装。
  • 你可以在命令行输入'node my_app.js' 来运行Javacript程序
  • JS通过V8 javascript引擎执行(这个玩意儿让Google Chrome跑得飞起)
  • Node提供了访问网络和文件系统的Javascript API

“但是我可以在: ruby, python, php, java,...!'做任何东西”

我知道。而且你是对的!Node不是能过去帮你干活的珍奇独角兽。不好意思,这只是一个工具,并且它也不太可能完完全全替代你常用的工具,至少现在不能。

“说人话!”

好。。。当你需要同时做好几件事,Node还是不错的。你有没有写过一段代码,然后大叫:“我希望这个能并行运行”?嗯哼,在node中,任何东西都是并行运行的,除了你的代码。

“神马?”

对,没错,任何东西都是并行运算的,除了你的代码。要理解这点,想象你的代码是国王,node是仆人。
一天从一个仆人叫醒国王并问他需要什么开始。国王给了仆人一串任务,然后就去补回笼觉了。仆人就去把这些工作分派给他的仆人同僚,接着同僚们各自干活去了。
一旦一个仆人完成了一项任务,他就去国王寝宫外排队汇报。国王每次让一个仆人进来,听取他的汇报。有时候国王会在仆人退出时给更多任务。
绳命,是剁么的回晃;绳命,是入刺的井猜,国王的仆人们可以并行执行国王的任务,但是每次只待着一个结果来汇报,国王当期来就so easy了,并且能集中注意力。

“说得好,但是你能不用这么2B的比喻,直接亮代码OK?”

好,一段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(仆人们)两个读写文件的任务,然后(国王)回去睡觉了。一旦node(仆人)完成了一个任务,回调(仆人去汇报)被激活。但是每次只能有一个回调(汇报)被激活。在一个回调(汇报)没执行结束前,其他的回调(汇报)都得排队。也就是说,不能保证回调被激活的顺序(因为必须排队嘛!)。

“那我不用关心同时代码访问同一个数据结构了?”

你开始理解了!这就是JavaScript单线程/事件循环设计的整个漂亮之处!

"太好了,但是为什么我要用它?"

一个很充分的理由,在web应用中,你的主要响应时间通常都花在访问数据库上了。用了node,你可以一次执行所有的查询,减少由于最慢的查询造成的等待。
另一个理由是Javascript。你能用node在前后端共用代码。JavaScript也正在成为通用语言。不管你以前用python, ruby, java, php...你总会用上一点儿js。
最后一个理由是速度。V8不断地推进动态语言解释器的速度边界。我不能想到还有其他语言像JavaScript一样正在被这样快地提高速度。换句话,node的I/O部分非常轻量,可以让你用上几乎系统的全部I/O能力。

“那你是说我应该从现在开始用node写我所有的apps?"

是也不是。一旦你用上了node这个锤子,其他的都要变成钉子了。但是如果你赶着deadline在干活,你可能想把你的决定建立在这些上:

  • 低响应/高并发是否重要?node很擅长这个。
  • 工程有多大?小工程还好,大工程应该好好权衡一番(可用的库,修正bug的资源等等)

"事件驱动编程真的难吗?"

这取决与你。如果你已经学会AJAX调用和浏览器的用户事件,开始用node不是问题。
无论哪种方式,测试驱动开发可以帮你赶上主流设计。

“我在哪里能学更多?”

中文的node学习讨论社区(抱歉,原文给出的都是英文的。这里换成中文站点了,我刚开始学习node.js,只发现这么个比较好的中文node站点。当然不懂的也可以在SF问)

这个比喻显然太简单了,但是也很难找到一个能把非阻塞描述地这么简单的比喻了。-- Felix