最近越来越多的听到大家讨论nodejs了,而且在招聘网站上也看到对node的要求,粗略看了一篇写的很好的文章。决定翻译一下:
我介绍Node.js给人们时通常有两种反应:或者立即理解,或者十分困惑。
你如果也是第二种,我尝试解释一下node:
我听到了。嗯,你是对的。抱歉,Node不是仙女会出现解决你所有的工作。它仅仅是一个工具,而且它可能还不能替代你现在的工具,至少现在不行。
"说重点!"
好的。当你需要同时处理几件事情时Node 将很有用。你曾经有没有写过一些代码,并且说“我想这段代码并行”?好的,在node里,所有的东西都是并行的,除了你的代码。
"神马?"
是的,你没听错。所有的东西都是并发运行,除了你的代码。为了理解这点,将您想象为国王,而node是国王的佣人群。
一切起始于,一个佣人唤醒国王,并且询问国王他是否需要什么。国王给这个佣人一个任务列表,然后回去多睡一会儿。佣人现在分发这些任务给他的伙计,他们开始工作了。
一旦一个佣人完成一项任务,他就在国王门外排队报告。国王一次见一位佣人,听他报告的事情。有时,国王会给这位佣人更多的任务。
感觉很棒,因为国王的佣人并发执行他所有的任务。但一次仅报告一个结果,所以国王能更加清晰。(简单的暗喻, 现实中很难给非阻塞找到合适的概念。)
"这很棒, 但你能不能不要这么幼稚的解释给我?"
当然,一个node程序的例子,如下:
你的代码给node两项任务:读和写文件,然后它睡觉。一旦node完成一项任务,它的回调函数就会被触发。但是一次只能触发一个回调函数,直到回调函数执行完毕了,所有其它回调函数都在排队.除了这点,不能保证下一步触发哪个回调函数。
"所以,我不用担心代码同时访问同一个数据结构吗?"
对的!这正是JavaScript 单线程/事件循环设计的美妙之处。
"很好, 但我为什么要用它?"
一个原因是效率。在web应用中,你主要的response开销,通常是执行数据库查询时间的总和。用node,你能执行立即执行所有的查询,response时间减少为最慢查询的持续时间。
另一个原因是JavaScript。你能在浏览器和后端之间使用node分享代码。JavaScript也变成真正通用的语言了。不管你过去用python,ruby,java,php... 你一路上都拾起了一些JS,对不?
最后一个原因是原始速度。在这个星球上最快的动态语言中,V8不断刷新纪录。我想不起来其它语言像JavaScript一样不停提示速度。除了这点,node的I/O 工具非常轻量级, 尽可能让你更贴近你系统的完整I/O能力。
"所以你是说我从今往后应该用node写我的apps了?"
是也不是。一旦你舞起node铁锤, 所有事情都迎刃而解(像变成了钉子)。但如果正赶工期处理一些事情,你可能需要考虑一下:
"node在windows上能运行吗?"
可以,目前最新的node可以直接下载安装到windows上。(注:作者原文发稿时,还不行)
"在node中我能访问DOM吗?"
好问题!不行,DOM是浏览器的东西,node的JS引擎(V8)幸好和这些东西是完全分离的。但是,有人在实现 the DOM as a node module, 它有可能开启让人兴奋的局面,例如单元测试客户端代码。
"事件驱动程序真的很难吗?"
那就看你的水平囖。如果你已经学会如何在浏览器中欺骗AJAX调用,和用户事件,使用node应该不成问题。
不管怎么样,用可维护设计,测试驱动开发能真的帮助你开始。
"谁在用它?"
有一个小型未完成列表, node wiki ("Companies using Node"下拉框).Yahoo 给YUI实验node, Plurk 用于 massive comet 和 Paul Bakaus (jQuery UI fame) 建立 mind-blowing game engine 后端有部分采用node. Joyent 雇用了 Ryan Dahl (node的创建人) 而且大量赞助开发.
对了,Heroku 宣传 (实验性) hosting support for node.js as well.
"我去哪能学到更多?"
Tim Caswell 开办了非常棒的How To Node 博客. 在twitter上关注 #nodejs . 订购 mailing list. 挂靠在 IRC 频道, #node.js
我也将持续在 debuggable.com 上写文章.
目前就这么多。如果你有问题,请留言。