我已经介绍过Node.js一般会引起两种反应:人们一般会立即“理解”或者因为困惑而终止。
如果你现在已经在第二组里,请看我试着解释node:
它是一个命令行工具。你下载一个tarball,解压并安装源代码。
它允许你在终端输入'node my_app.js'运行Javascript程序。
JS运行于V8 javascript engine(它是的Google Chrome如此之快)。
Node提供一个Javascript APT来链接网络和文件系统。
“但我能用ruby, python, php, java, ... 做任何事!”
我听到了。你是对的!对不起,Node不是来帮你做工作的奇怪的独角兽。它只是一个工具,它可能不会完全地代替你常规的工具,至少目前不会。
"直截了当地说!"
好吧,我会的。基本上,当你需要同时做很多事的时候,Node很好。你曾经写过一段儿代码并说“我希望这能够并行的运行”?好,Node里一切都是并行的运行,除了你的代码。
"嗯?"
就是这样,一切都是并行运行的,除了你的代码。为了理解这点,想象你的代码是国王,node是他的仆人军队。
日子是从一个仆人唤醒国王问他所需开始的。国王给这位仆人一张任务列表然后再小睡一会。这位仆人开始向他的同事们分发任务并让他们工作。
每当一位仆人完成一份工作,当他完成一个任务,他就排列好给国王汇报。国王每次让一名仆人进来听他汇报。有时,当他走出去的时候国王会给他更多的的任务。
生活很美好,对于国王的仆人,他们并行地携带他的任务,但是同事只汇报一个结果, 这样国王可以专注。
"那太棒了,但是你能不做愚蠢的比喻而认真的对我讲吗?
当然。一个简单的Node程序这这样的:
你的代码给Node两个任务读写一个文件,然后休眠。当Node完成一个任务,回调函数被触发。但是这里只能同时运行一个回调函数。直到回调函数执行完毕之前,所有其他回调函数需要排队等待。另外,执行任何一个回调函数是无序的。
“所以我不需要担心代码同时解除相同的数据?”
你明白了!这就是全部Javascript单线程/事件轮询的精华!
"很好,但是我为什么要用他呢?"
一个原因是高效。在一个web应用中,主要的响应花费在执行查询数据库。使用Node,会减少响应的时间当执行最慢的查询。
另外一个原因是JavaScript。你能在浏览器和服务器之间分享代码。JavaScript也正在成为全球性的编程语言。无论你过去是否做过python, ruby, java, php...... 在过程中你可能会用到javascript,对吧?
最后一个原因就是运行速度。V8引擎在这个星球上不断扩张他的境界。我现在 无法想到哪个语言会在速度方面对JavaScript造成威胁。另外,In addition to that, node的I/O设备非常轻量,会让你尽可能地完全地利用你全部系统的空间。
"所以你劝说我从现在开始用node来做所有我的应用?"
可以这么说但又不是。一旦你开始挥动node的锤子,一切都看起来像个钉子。但是如果你正在做一个很紧迫的项目,你也许需要以下几个依据来做决定:
低响应时间,高并行更重要?Node擅长于此。
项目多大? 小项目还适合。大项目应该仔细评估(多种类库,资源用来修改问题,或者逆流而上,等等)。
"Node可以运行在windows吗?"
不行。如果你在windows,你需要用Linux运行一个虚拟机(我推荐VirtualBox)。Windows支持node在计划之中,除非你想帮助他,否则你得屏住呼吸等几个月。
"在node中我能链接DOM吗?"
问的非常好!答案是不行,DOM是浏览器的东西,node JS的运行引擎应该从那混乱中完全地分开。然而,有些人正在做这样的事:the DOM as a node module, 这会让许多有趣的事变成可能,比如在可以互动进行单元测试。
"事件驱动编程很难吗?"
那就不一定了。如果你已经学会了在浏览器里玩AJAX的请求和响应,那么适应node应该不是问题。无论如何,测试驱动开发能帮你想到可维护的设计。
"谁在用呢?"
这里是一个小的不完全的列表node wiki(找到 "Companies using Node").Yahoo正在给YUI做node实验Plurk正在应用于很多的comet。并且, Paul Bakaus 正在建立mind-blowing game engine一些node后端的东西。
———— 2015.10.15 摘自Debuggable,原文链接