「译文」理解Node.js

一篇2010年的文章,本身读完后一些对node.js的疑问迎刃而解,因为文章比较旧,因此文中描述的状况有些已经发生了变化,在翻译过程当中会一一指出。javascript

原文:http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cbphp

当我把Node.js介绍给人们的时候,一般会产生两种反应。总的来讲人们不是能够正确的理解它,就是被搞得很是糊涂。java

若是你到目前为止还处于第二组里,下面是我想要用来说解node的内容:node

  • 它是一个命令行工具。你下载一个tarball文件,编译并安装源码。
  • 它可让你在你的终端中经过输入'node my_app.js'来运行JavaScript程序。
  • JS是被V8 javascript引擎(使Google Chrome运行如此之快的东西)所执行的。
  • Node提供了一个用来访问网络和文件系统的JavaScript API。

“可是我能够作任何我想要作的事情用:ruby,python,php,java, ... !”python

我听到了你的声音。你是对的。Node不是该死的独角兽,它不会帮你作你本身的工做,抱歉。它只是一个工具,而且它大概也不会彻底地替换你经常使用的工具,至少当前不会。git

“说重点!”github

好的,我会的。Node总的来讲很是优秀当你须要同时作许多事情的时候。你有过写了一部分代码而后说“我想要这个并行执行”吗?好吧,在node中任何东西都是并行运行的,除了你的代码。web

“嘿?”数据库

是的没错,任何东西都是并行的,除了你的代码。为了理解它,把你的代码想像成是国王,而后node是它的仆从军队。编程

新的一天以仆从叫醒国王而且问他是否须要什么而开始了。国王给了这个仆从一个任务列表,而后回去继续睡觉去了(汗)。这个仆从把这些任务分配给了他的同僚,而后他们开始工做。

当一个仆从完成了一个任务,他会在国王领地外边排成一条线来汇报。国王一次让一个仆从进来,而后听取他的报告。有时候国王会在仆从出去的时候给仆从更多的任务。

生活是美好的,由于国王的仆从并行的执行他的任务,可是一次只报告一个结果,因此国王能够专一。*

“那是异想天开,可是你能结束这个愚蠢的比喻而且用geek的方式告诉我吗?”

固然。一个简单的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来写我全部的应用?”

是和不是。一旦你开始抡node这个锤子,那么显然一切开始看起来都像一个钉子。可是若是你当前的工做有一个期限,你能够经过如下来决定:

  • 是否低响应时间/高并发重要?Node真的很擅长它。
  • 项目有多大?小项目问题不大。大项目应该当心的评估(可用的库,修复一个bug所需的资源或者two upstream等等)。

“node能运行在Windows上吗?”

不行。若是你使用的是windows,你须要运行一个Linux虚拟机(我推荐VirtualBox)。node对Windows的支持在计划中了,可是接下来的几个月不要屏住呼吸除非你想对port提供帮助。(译者:如今node能够完美的运行在Windows上)

“我能在node中访问DOM吗?”

好问题!不行,DOM是浏览器中的东东,而且node的JS引擎(V8)幸亏跟那些混乱的东西是彻底分离的。不过,有人在以node模块的形式来实现DOM,可能带来使人兴奋的可能性好比对客户端代码进行单元测试。

“难道事件驱动编程不是真的很是难吗?”

这取决于你。若是你已经学过如何在浏览器中摆弄AJAX调用和用户事件,那么使用node不会是一个问题。

同时,测试驱动开发能够真正的帮助你以一个可维护的设计作为开始。

“谁在用它?”

node wiki(滚动到"Companies using Node")有一个小的/不全的列表。Yahoo正在为YUI对node进行实验,Plurk正在使用它处理大规模的comet,而且Paul Bakaus(因为jQuery UI而出名)正在建立一个使人兴奋的游戏引擎,其中后端使用了一些node代码。Joyent已经雇佣了Ryan Dahl(node做者)而且大力资助开发。

对了,Heroku也刚刚声明了支持对node.js的托管

“我能去哪里学更多?”

Tim Caswell正在运做优秀的How To Node博客。在twitter上Follow #nodejs。订阅邮件列表。而后去IRC频道逛逛,#node.js(是的,名字中包含这个点)。咱们在那的划艇分数快达到200了:)。

我也将会继续在debuggable.com这里写文章。

当前就写这么多了。若是你有其余问题欢迎留言。

--注解:

*: 这个比喻显然是太简单了,可是在现实之中找到一个与非阻塞概念相对应的对照物很难。

相关文章
相关标签/搜索