本文翻译自 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 应该不成问题。

无论哪种方式,测试驱动开发都可以真正帮助您提出可维护的设计。

最后修改:2021 年 11 月 23 日 07 : 32 PM
如果觉得我的文章对你有用,请随意赞赏