本文翻译自 Felix Geisendörfer 的博客文章《Understanding node.js》。
当我向别人介绍 Node.js
时,人们通常有两种反应,要么很快就理解了,要么最终还是很困惑。
如果你属于后者,听听我对 Node 的解释:
- Node 是一个命令行工具,你可以用它来下载压缩包,编译和安装源代码。
- 它可以运行 JavaScript 项目(通过在终端执行
node my_app.js
命令)。 - JS 代码是通过 V8 JavaScript 引擎执行的(Google 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.writeFile('letter-to-princess.txt', '...', function() {
sys.puts("can't wait to hear back from her!");
});
程序给了 Node 两个任务 读文件
和 写文件
,然后进入休眠状态。一旦 Node 完成一项任务,就会触发它的回调。但是同一时间只能有一个回调被触发(当一个回调执行时,所有其他回调必须排队等待)。
此外,回调触发的顺序无法保证。
所以我不用担心代码在同一时间访问相同的数据结构?
你说得对!这正是 JavaScripts单线程 + 事件循环设计的美妙之处!
很好,但是我为什么要用它呢?
一个原因是 效率
。在 web 应用程序中,您的主要响应时间通常是执行 所有数据库查询所需时间的总和
。使用node,您可以一次执行所有查询,将响应时间减少到执行 最慢查询所需的时间
。
另一个原因是 JavaScript
。您可以使用 node 在浏览器和后端之间共享代码,JavaScript 也正在成为一种真正的通用语言。
最后一个原因是原始速度。V8 引擎不断突破极限,成为地表最快的动态语言解释器之一。我无法想象还有任何一种语言像 JavaScript 现在这样在追求速度。除此之外,node的 I/O 功能非常轻量级,可以尽可能地充分利用系统的全部I/O容量。
你是说从现在开始我应该把所有的应用程序放在 node 中编写?
当你开始挥舞锤子时,所有东西都看起来像钉子。
如果你手头的项目有截止日期,你可以考虑以下几点来做决定:
- 低响应时间/高并发性重要吗?Node在这方面做得很好。
- 这个项目有多大?小项目应该没问题。大型项目应该仔细评估。
node 能在 Windows 上运行吗?
不能。如果在windows上,你需要运行一个 Linux 虚拟机(我推荐VirtualBox)。
我可以访问节点中的DOM吗?
非常好的问题!
不可以,DOM 是一个浏览器的东西,而 node 的 JS 引擎(V8) 是完全独立的。然而,有人正在将 DOM 实现为一个 Node 模块,这可能会带来非常令人兴奋的可能性,比如对客户端代码进行单元测试。
事件驱动编程真的很难吗?
那要看你了。如果您已经学习了如何在浏览器中处理 AJAX 调用和用户事件,那么使用 node 应该不成问题。
无论哪种方式,测试驱动开发都可以真正帮助您提出可维护的设计。
此处评论已关闭