解惑Node.js

翻译自http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb

原作者:Felix Geisendörfer 译者:Bruce Xiong

 

当我给人们介绍Node.js时通常会有两种反应: 他们要不是马上就明白了,要不一直搞不清楚。

 

如果目前你是第二类人,下面让我尝试对Node进行一些说明:

- Node是一个命令行工具,你可以下载一个源码包(tarball),然后编译安装。

- Node能够让你在浏览器外运行JavaScript程序,只要在命令行中输入: node my_app.js。

- JS代码将由V8 javascript engine运行,是它让Chrome运行如此之快。

- 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.wirteFile('letter-to-princess.txt', '...', function() {
  sys.puts("can't wait to hear back from her!");
});

你的代码给node两件任务,读一个文件和写一个文件,然后就去“睡觉”了。一旦node完成了一件任务,就会触发相应回调函数。但是在同一时刻只能运行一个回调函数,其他回掉函数必须排队等待,需要说明的是,这里对回调函数触发的顺序没有任何保证。

 

“这样说来我就不用担心这些代码同时访问相同的数据了?”

你说对了,这就是JavaScript的单线程/事件循环机制的优雅。

 

“确实很棒,但是我为什么要用它?”

效率是一个原因。在Web应用中,响应时间中很大一部分常常是被数据库查询花费掉了。有了node,你可以一次性执行所有查询,这样就减少了响应时间。

另一个原因是node和JavaScript的关系。你可以用node来在浏览器和你的后端共享代码。JavaScript也正在变成一个真正的全能语言。无论你以前使用Python, Ruby, Java, PHP还是其他语言,你都用过一些JS,不是吗?

最后一个原因是运行速度,V8一直在打破地球上最快动态语言解释器的记录。我不知道还有其他语言有像JavaScript一样被积极的提升速度。同时,node的I/O实现非常轻量,使它几乎能利用你系统全部I/O能力。

 

“你是说我应该从今以后用node写我所有的应用了吗?”

既是又不是。你当然可以用node写你所有的应用,不过如果你的工作有一个截止日期的话,你应该要考虑以下一些问题:

- 低响应时间、高并发对你的应用重要吗?Node对这个很在行。

- 项目有多大?小项目应该没有问题,但是大项目需要认真衡量(可用的类库,Bug的修复,上下游,等等)。

 

“能在Windows上运行吗?”

是的,现在Node已经可以在Windows上运行,只需要在Node网站上下载相应的二进制安装包。

 

“我能够在Node里面操作DOM吗?”

很棒的问题!不过答案是No。DOM是浏览器的范畴,而node的V8引擎和浏览器完全分离。

 

“事件驱动编程是不是很难?”

这取决于你自己。如果你已经学过浏览器里的AJAX调用和用户事件,习惯Node应该不是一个问题。另一方面,事件驱动开发能够帮助你实现易维护设计。

 

“有谁在用Node?”

这里有一个不完全的列表:node wiki

 

“我能从哪里了解更多?”

Tim Caswell维护者一个非常棒的博客:How To Node,你也可以在Twitter上Follow#nodejs,或者订阅 mailing list,或者在IRC的#node.js频道交流。

我也会继续在debuggable.com上写文章。

就这样了,如果你有更多问题,请告诉我,不要不好意思。

(完)

posted @ 2013-09-01 23:04  BruceX  阅读(476)  评论(1)    收藏  举报