我不完全明白什么 Node.js 就是这样。也许是因为我主要是一个基于网络的业务应用程序开发人员。它是什么以及它有什么用?

到目前为止我的理解是:

  1. 编程模型是事件驱动的,尤其是它处理的方式 输入/输出.
  2. 它用 JavaScript 解析器是 V8.
  3. 它可以轻松地用于创建并发服务器应用程序。

我的理解正确吗?如果是,那么事件 I/O 的好处是什么?它只是更适合并发性吗?另外,Node.js 的方向是成为一个类似基于 JavaScript(基于 V8)的编程模型的框架吗?

有帮助吗?

解决方案

我认为优点是:

  1. 在虚拟机 (V8) 上使用动态语言 (JavaScript) 进行 Web 开发速度非常快。它比 Ruby、Python 或 Perl 快得多。

  2. 能够在单个进程上以最小的开销处理数千个并发连接。

  3. JavaScript 非常适合具有一流函数对象和闭包的事件循环。人们已经知道如何以这种方式使用它,并在浏览器中使用它来响应用户发起的事件。

  4. 很多人已经了解 JavaScript,即使是那些不自称程序员的人。它可以说是最流行的编程语言。

  5. 在 Web 服务器和浏览器上使用 JavaScript 可以减少两个编程环境之间的阻抗不匹配,这两个编程环境可以通过 JSON 通信数据结构,而这些数据结构在等式两边的工作方式相同。重复的表单验证代码可以在服务器和客户端等之间共享。

其他提示

我在工作中使用 Node.js,发现它非常强大。被迫选择一个词来描述 Node.js,我会说“有趣”(这不是一个纯粹的正面形容词)。社区充满活力并不断发展。尽管 JavaScript 很奇怪,但它仍然是一种很棒的编码语言。您每天都会重新思考自己对“最佳实践”和结构良好的代码模式的理解。现在有大量的想法涌入 Node.js,在其中工作可以让你接触到所有这些想法 - 伟大的精神举重。

Node.js 在生产中肯定是可能的,但距离文档中看似承诺的“交钥匙”部署还很远。在 Node.js v0.6.x 中,“集群”已集成到平台中,提供了基本的构建块之一,但我的“product.js”脚本仍然有约 150 行逻辑来处理创建日志等内容名录、回收死去的工人等对于“严肃的”生产服务,您还需要准备好限制传入连接并执行 Apache 所做的所有操作 PHP. 。公平起见, 红宝石 on Rails 有这个 精确的 问题。它通过两种互补机制解决:1) 将 Ruby on Rails/Node.js 放在专用的 Web 服务器后面(用 C 编写并经过反复测试),例如 nginx (或者 阿帕奇 / 莱特德)。Web 服务器可以有效地提供静态内容、访问日志记录、重写 URL、终止 SSL协议, 、执行访问规则并管理多个子服务。对于命中实际节点服务的请求,Web 服务器会代理该请求。2)使用类似的框架 独角兽 它将管理工作进程,定期回收它们等。我还没有找到一个看起来完全成熟的 Node.js 服务框架;它可能存在,但我还没有找到它,并且仍在我的手卷“生产.js”中使用〜150行。

阅读框架如 表达 看起来标准做法就是通过一个万能的 Node.js 服务来提供一切服务......“app.use(express.static(__dirname + '/public'))”。对于低负载服务和开发来说,这可能没问题。但是,一旦您尝试在服务上投入大量时间并让它 24/7 运行,您很快就会发现推动大型网站拥有精心烘焙、强化的 C 代码的动机,例如 nginx 前端他们的网站并处理所有静态内容请求(......直到您设置一个 CDN, , 喜欢 亚马逊云前))。对于这个有点幽默和毫不掩饰的负面看法,请参阅 这家伙.

Node.js 也发现了越来越多的非服务用途。即使您使用其他东西来提供 Web 内容,您仍然可以使用 Node.js 作为构建工具,使用 新项目管理 组织代码的模块, 浏览器化 将其拼接成单个资产,并且 uglify-js 缩小它以进行部署。对于处理网络,JavaScript 是一个完美的选择 阻抗匹配 这通常使其成为最简单的攻击途径。例如,如果你想卑躬屈膝地通过一堆 JSON 响应有效负载,你应该使用我的 下划线-CLI 模块,结构化数据的实用带。

优点缺点:

  • 专业人士:对于服务器人员来说,在后端编写 JavaScript 一直是学习现代 UI 模式的“入门药物”。我不再害怕编写客户端代码。
  • 专业人士:倾向于鼓励适当的错误检查(几乎所有回调都会返回 err,困扰程序员来处理它;此外,async.js 和其他库比典型的同步代码更好地处理“如果这些子任务中的任何一个失败,则失败”范例)
  • 专业人士:一些有趣且通常困难的任务变得微不足道 - 例如获取运行中任务的状态、工作人员之间的通信或共享缓存状态
  • 专业人士:庞大的社区和大量基于可靠的包管理器(npm)的优秀库
  • 缺点:JavaScript 没有标准库。您已经习惯了导入功能,以至于当您使用 JSON.parse 或其他不需要添加 npm 模块的内置方法时,会感觉很奇怪。这意味着一切都有五个版本。如果您对默认实现不满意,甚至 Node.js“核心”中包含的模块还有五个变体。这导致了快速的演变,但也带来了一定程度的混乱。

与简单的每个请求一个进程模型():

  • 专业人士:可扩展到数千个活动连接。非常快而且非常高效。对于 Web 队列来说,这可能意味着与 PHP 或 Ruby 相比,所需的盒子数量减少了 10 倍
  • 专业人士:编写并行模式很容易。想象一下,您需要从以下位置获取三个(或 N)个 blob 内存缓存. 。在 PHP 中执行此操作...您是否刚刚编写了获取第一个 blob、然后是第二个、然后是第三个 blob 的代码?哇,那太慢了。有一个特别的 聚乙二醇 模块来解决 Memcached 的特定问题,但是如果您想与数据库查询并行获取一些 Memcached 数据怎么办?在 Node.js 中,由于范例是异步的,因此让一个 Web 请求并行执行多个操作是很自然的。
  • 缺点:异步代码从根本上来说比同步代码更复杂,如果没有充分理解并发执行的实际含义,那么前期的学习曲线对于开发人员来说可能会很困难。尽管如此,它比编写任何类型的带锁定的多线程代码要困难得多。
  • 缺点:例如,如果计算密集型请求运行 100 毫秒,它将停止处理同一 Node.js 进程中正在处理的其他请求...又名, 合作多任务处理. 。这可以通过 Web Workers 模式来缓解(剥离子流程来处理昂贵的任务)。或者,您可以使用大量 Node.js 工作线程,并且只让每个工作线程同时处理一个请求(仍然相当高效,因为没有进程回收)。
  • 缺点:运行生产系统比运行系统复杂得多 计算机图形图像处理 Apache + PHP 等模型, 珀尔, 红宝石, , ETC。未处理的异常将导致整个流程崩溃,需要逻辑来重新启动失败的工作人员(请参阅 )。具有错误的本机代码的模块可能会使进程严重崩溃。每当一个工作线程死亡时,它正在处理的任何请求都会被丢弃,因此一个有缺陷的 API 很容易降低其他共同托管的 API 的服务质量。

与用 Java / C# / C(C?真的吗?)

  • 专业人士:在 Node.js 中执行异步比在其他任何地方执行线程安全更容易,并且可以说提供了更大的好处。Node.js 是迄今为止我使用过的最不痛苦的异步范例。有了好的库,它只比编写同步代码稍微困难一点。
  • 专业人士:没有多线程/锁定错误。确实,您需要预先编写更详细的代码来表达没有阻塞操作的正确异步工作流程。您需要编写一些测试并使其正常工作(它是一种脚本语言,并且胖手指变量名称仅在单元测试时捕获)。但是,一旦你让它工作,表面积 海森巴格 ——奇怪的问题在一百万次运行中才会出现一次——表面积要小得多。编写 Node.js 代码的税收大量提前加载到编码阶段。然后你往往会得到稳定的代码。
  • 专业人士:JavaScript 在表达功能方面更加轻量级。很难用言语来证明这一点,但是 JSON, 、动态类型、lambda 表示法、原型继承、轻量级模块,等等......只是往往需要更少的代码来表达相同的想法。
  • 缺点:也许您真的非常喜欢 Java 编码服务?

有关 JavaScript 和 Node.js 的另一个视角,请查看 从 Java 到 Node.js, ,一篇关于 Java 开发人员学习 Node.js 的印象和经验的博客文章。


模块在考虑 Node 时,请记住您选择的 JavaScript 库将 定义 你的经验。大多数人至少使用两个,一个异步模式助手(Step、Futures、Async)和一个 JavaScript 糖模块(下划线.js).

帮助程序/JavaScript 糖:

  • 下划线.js - 用这个。去做就对了。它使您的代码变得漂亮且可读,例如 _.isString() 和 _.isArray()。我不太确定否则如何编写安全代码。另外,对于增强的命令行功能,请查看我自己的 下划线-CLI.

异步模式模块:

  • - 一种非常优雅的方式来表达串行和并行操作的组合。我个人的推荐。看 我的帖子 步骤代码是什么样的。
  • 期货 - 通过需求表达排序的更灵活(这真的是一件好事吗?)的方式。可以表达“并行启动a、b、c”之类的内容。当A、B完成后,开始AB。当 A 和 C 完成时,启动 AC。”这种灵活性需要更加小心,以避免工作流程中出现错误(例如从不调用回调,或多次调用它)。看 雷诺斯的帖子 关于使用期货(这是让我“得到”期货的帖子)。
  • 异步 - 更传统的库,每种模式都有一种方法。在我虔诚地转向 Step 之前,我就开始了这一点,随后意识到 Async 中的所有模式都可以用一个更具可读性的范例在 Step 中表达。
  • 驯服JS - 由 OKCupid 编写,它是一个预编译器,添加了新的语言原语“await”,用于优雅地编写串行和并行工作流程。该模式看起来很棒,但它确实需要预编译。关于这一点我还在拿定主意。
  • StreamlineJS - TameJS 的竞争对手。我倾向于Tame,但你可以自己做决定。

或者要阅读有关异步库的所有内容,请参阅 本次小组访谈 与作者们。

网络框架:

  • 表达 用于组织网站的出色 Ruby on Rails-esk 框架。它用 作为一个 XML/HTML 模板引擎,它使得构建 HTML 变得不再那么痛苦,甚至几乎是优雅的。
  • jQuery 虽然从技术上讲,jQuery 不是一个节点模块,但它正在迅速成为客户端用户界面的事实上的标准。jQuery 提供类似 CSS 的选择器来“查询”DOM 元素集,然后对其进行操作(设置处理程序、属性、样式等)。沿着同样的思路,Twitter 引导程序 CSS框架, 骨干网.js多维控制器 图案,以及 Browserify.js 将所有 JavaScript 文件拼接到一个文件中。这些模块都正在成为事实上的标准,因此如果您还没有听说过它们,您至少应该检查一下它们。

测试:

  • JSHint - 必须使用;我一开始没有使用这个,现在看来难以理解。JSLint 添加了使用 Java 等编译语言获得的一系列基本验证。括号不匹配、未声明的变量、多种形状和大小的打字。您还可以打开我所说的“肛门模式”的各种形式,您可以在其中验证空白的样式和诸如此类的东西,如果这是您喜欢的,那就没问题了——但真正的价值来自于获得有关确切行号的即时反馈,其中你忘记了结束语“)”...无需运行代码并点击有问题的行。“JSHint”是一个更可配置的变体 道格拉斯·克罗克福德JSLint.
  • 摩卡 我开始更喜欢誓言的竞争对手。这两个框架都能很好地处理基础知识,但复杂的模式往往更容易在 Mocha 中表达。
  • 誓言 誓言确实很优雅。它会打印出一份可爱的报告(--spec),显示哪些测试用例通过/失败。花 30 分钟学习它,您就可以轻松地为您的模块创建基本测试。
  • 僵尸 - 使用 HTML 和 JavaScript 进行无头测试 JSDom 作为虚拟“浏览器”。非常强大的东西。将其与 重播 对浏览器内代码进行闪电般快速的确定性测试。
  • 关于如何“思考”测试的评论:
    • 测试是非可选的。对于像 JavaScript 这样的动态语言,有 非常 一些静态检查。例如,将两个参数传递给需要 4 个参数的方法在执行代码之前不会中断。在 JavaScript 中创建错误的门槛相当低。基本测试对于弥补编译语言的验证差距至关重要。
    • 忘记验证,只需让代码执行即可。对于每种方法,我的第一个验证案例是“没有任何问题”,这是最常触发的情况。证明您的代码运行时不会抛出异常,可以捕获 80% 的错误,并且可以极大地提高您的代码信心,您会发现自己要返回并添加您跳过的细致入微的验证案例。
    • 从小事做起,打破惯性障碍。我们都很懒,时间紧迫,很容易将测试视为“额外的工作”。所以从小事做起。编写测试用例 0 - 加载模块并报告成功。如果你强迫自己做这么多,那么测试的惯性障碍就被打破了。第一次执行此操作只需不到 30 分钟,包括阅读文档。现在编写测试用例 1 - 调用您的方法之一并验证“没有中断”,也就是说,您没有收到错误。测试用例 1 应该花费不到一分钟的时间。随着惯性的消失,逐步扩大测试覆盖范围变得很容易。
    • 现在用您的代码改进您的测试。不要被模拟服务器等“正确的”端到端测试的样子吓到。代码从简单开始,逐渐发展以处理新情况;测试也应该如此。当您向代码添加新案例和新复杂性时,请添加测试案例来测试新代码。当您发现错误时,添加验证和/或新案例以覆盖有缺陷的代码。当您在调试并对一段代码失去信心时,请返回并添加测试以证明它正在按照您的想法进行。捕获示例数据字符串(来自您调用的其他服务、您抓取的网站等)并将其提供给您的解析代码。这里有一些案例,那里改进了验证,您最终将得到高度可靠的代码。

另外,请查看 官方名单 推荐的 Node.js 模块。然而, GitHub 的 节点模块维基 更完整并且是一个很好的资源。


要理解 Node,考虑一些关键的设计选择会很有帮助:

Node.js 是 基于事件异步 / 非阻塞. 。事件(例如传入的 HTTP 连接)将触发 JavaScript 函数,该函数执行一些工作并启动其他异步任务,例如连接到数据库或从另一台服务器提取内容。一旦这些任务开始,事件函数就会完成,Node.js 将返回睡眠状态。一旦发生其他事情,例如建立数据库连接或外部服务器响应内容,回调函数就会触发,并且执行更多 JavaScript 代码,可能会启动更多异步任务(例如数据库查询)。通过这种方式,Node.js 将愉快地为多个并行工作流程交错活动,运行任何在任何时间点都畅通无阻的活动。这就是 Node.js 在管理数千个并发连接方面做得如此出色的原因。

为什么不像其他人一样为每个连接使用一个进程/线程呢? 在 Node.js 中,一个新连接只是一个非常小的堆分配。启动一个新进程需要显着更多的内存,在某些平台上需要兆字节。但真正的成本是与上下文切换相关的开销。当您有 10^6 个内核线程时,内核必须做大量工作来确定下一个应该执行的人。为 Linux 构建 O(1) 调度程序已经做了很多工作,但最终,单个事件驱动进程比竞争 CPU 时间的 10^6 个进程要高效得多。此外,在过载情况下,多进程模型的表现非常糟糕,导致关键的管理和管理服务匮乏,尤其是 SSHD(这意味着您甚至无法登录到盒子来弄清楚它到底有多糟糕)。

Node.js 是 单线程自由锁定. 。Node.js 作为一个经过深思熟虑的设计选择,每个进程只有一个线程。因此,多个线程根本不可能同时访问数据。因此,不需要锁。线程很难。真的真的很难。如果您不相信这一点,那么您还没有进行足够的线程编程。正确锁定是很困难的,并且会导致很难追踪的错误。消除锁和多线程可以让最令人讨厌的错误之一消失。这可能是节点的最大优势。

但我该如何利用我的 16 核盒子呢?

两种方式:

  1. 对于图像编码等大型计算任务,Node.js 可以启动子进程或向其他工作进程发送消息。在此设计中,您将有一个线程管理事件流,N 个进程执行繁重的计算任务并占用其他 15 个 CPU。
  2. 为了扩展 Web 服务的吞吐量,您应该在一个机器上运行多个 Node.js 服务器,每个核心一个,使用 (对于 Node.js v0.6.x,此处链接的官方“集群”模块取代了具有不同 API 的 learnboost 版本)。然后,这些本地 Node.js 服务器可以在套接字上竞争以接受新连接,从而平衡它们之间的负载。一旦连接被接受,它就会紧密地绑定到这些共享进程中的一个。从理论上讲,这听起来很糟糕,但实际上它工作得很好,并且可以让您避免编写线程安全代码的麻烦。此外,这意味着 Node.js 具有出色的 CPU 缓存亲和性,可以更有效地使用内存带宽。

Node.js 让您可以毫不费力地完成一些非常强大的事情。 假设您有一个 Node.js 程序,它执行各种任务,侦听 传输控制协议 命令端口,编码一些图像,等等。通过五行代码,您可以添加基于 HTTP 的 Web 管理门户,该门户显示活动任务的当前状态。这很容易做到:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

现在您可以点击 URL 并检查正在运行的进程的状态。添加几个按钮,您就拥有了一个“管理门户”。如果您有一个正在运行的 Perl / Python / Ruby 脚本,那么仅仅“投入管理门户”并不那么简单。

但是 JavaScript 不是很慢/很糟糕/很邪恶/是魔鬼的衍生者吗? JavaScript 有一些奇怪的地方,但凭借“好的部分”,它是一种非常强大的语言,无论如何,JavaScript 是客户端(浏览器)上的语言。JavaScript 将会继续存在;其他语言将其作为 IL 的目标,世界一流的人才正在竞相开发最先进的 JavaScript 引擎。由于 JavaScript 在浏览器中的作用,人们投入了大量的工程工作来使 JavaScript 变得极快。 V8 是最新、最好的 JavaScript 引擎,至少本月是这样。它在效率和稳定性方面都击败了其他脚本语言(看看你,Ruby)。只有微软、谷歌和 Mozilla 的庞大团队致力于解决这个问题,竞相构建最好的 JavaScript 引擎(它不再是 JavaScript“解释器”,因为所有现代引擎都会做大量的事情),它才会变得更好。 准时生产 在后台进行编译,并进行解释,仅作为执行一次代码的后备)。是的,我们都希望能够修复一些更奇怪的 JavaScript 语言选择,但这实际上并没有那么糟糕。而且该语言非常灵活,您实际上不是在编写 JavaScript,而是在编写 Step 或 jQuery - 与任何其他语言相比,在 JavaScript 中,库更能定义体验。要构建 Web 应用程序,您几乎必须了解 JavaScript,因此在服务器上使用它进行编码具有某种技能组合的协同作用。它让我不再害怕编写客户端代码。

此外,如果你真的讨厌 JavaScript,你可以使用语法糖,比如 咖啡脚本. 。或者任何其他创建 JavaScript 代码的东西,比如 Google 网络工具包 (GWT)。

说到 JavaScript,什么是“闭包”? - 几乎是一种奇特的方式来表示您在调用链中保留词法范围的变量。;) 像这样:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

看看如何只使用“myData”而不做任何尴尬的事情,例如将其存储到对象中?与 Java 不同的是,“myData”变量不必是只读的。这种强大的语言功能使异步编程变得不再那么冗长和痛苦。

编写异步代码总是比编写简单的单线程脚本更复杂,但是使用 Node.js,这并没有那么困难,除了对数千个并发连接的效率和可扩展性之外,您还可以获得很多好处。 ..

V8 是 JavaScript 的一个实现。它允许您运行独立的 JavaScript 应用程序(除其他外)。

Node.js 只是一个为 V8 编写的库,它执行事件 I/O。这个概念解释起来有点棘手,我相信有人会用比我更好的解释来回答......要点是,您不必进行一些输入或输出并等待它发生,您只需 等待它完成。例如,询问文件的上次编辑时间:

// Pseudo code
stat( 'somefile' )

这可能需要几毫秒,也可能需要几秒钟。与事件 输入/输出 您只需触发请求,而不是等待,而是附加一个在请求完成时运行的回调:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

这使得它很像浏览器中的 JavaScript 代码(例如, 阿贾克斯 样式功能)。

欲了解更多信息,您应该查看这篇文章 Node.js 确实令人兴奋 这是我对图书馆/平台的介绍......我发现它非常好。

Node.js 是一个为服务器端 JavaScript 代码构建的开源命令行工具。您可以下载一个 压缩包, ,编译并安装源码。它允许您运行 JavaScript 程序。

JavaScript 是由 V8, ,由 Google 开发的 JavaScript 引擎,用于 铬合金 浏览器。它使用 JavaScript API 来访问网络和文件系统。

它因其性能和执行并行操作的能力而广受欢迎。

了解 Node.js 是最好的解释 节点.js 到目前为止我已经找到了。

以下是一些关于该主题的好文章。

闭包是一种在创建代码的上下文中执行代码的方法。

这对于并发意味着您可以定义变量,然后启动非阻塞 输入/输出 函数,并向其发送一个匿名函数以进行回调。

当任务完成时,回调函数将在变量的上下文中执行,这就是闭包。

闭包如此适合编写具有非阻塞 I/O 的应用程序的原因是,管理异步执行函数的上下文非常容易。

两个很好的例子是关于如何管理模板和使用渐进增强功能。您只需要一些轻量级的 JavaScript 代码即可使其完美运行。

我强烈建议您观看并阅读这些文章:

选择任何语言并尝试记住如何管理 HTML 文件模板以及更新单个文件模板所需执行的操作 CSS 你的类名 DOM 结构(例如,用户单击菜单项,您希望将其标记为“已选择”并更新页面内容)。

使用 Node.js,就像在客户端 JavaScript 代码中执行一样简单。获取 DOM 节点并将 CSS 类应用到该节点。获取您的 DOM 节点和innerHTML 您的内容(您将需要一些额外的 JavaScript 代码来执行此操作。阅读文章了解更多)。

另一个很好的例子是,您可以使用同一段代码使您的网页与打开或关闭的 JavaScript 兼容。想象一下,您有一个用 JavaScript 进行的日期选择,允许您的用户使用日历选择任何日期。您可以编写(或使用)同一段 JavaScript 代码,使其在 JavaScript 打开或关闭的情况下工作。

有一个非常好的快餐店比喻,最能解释 Node.js 的事件驱动模型,请参阅完整文章, Node.js、医生办公室和快餐店 – 了解事件驱动编程

总结如下:

如果快餐店遵循传统的基于线程的模式,您将点完食物并排队等候,直到收到食物。在您的订单完成之前,您后面的人将无法订购。在事件驱动的模型中,您点了食物,然后离开队伍等待。然后其他人都可以自由订购。

Node.js 是事件驱动的,但大多数 Web 服务器是基于线程的。York 解释了 Node.js 的工作原理:

  • 您可以使用Web浏览器在Node.js Web服务器上提出“/about.html”的请求。

  • Node.js服务器接受您的请求,并调用一个函数以从磁盘检索该文件。

  • 当Node.js服务器正在等待检索文件时,它将为下一个Web请求提供服务。

  • 检索文件时,有一个回调函数,该函数插入了Node.js服务器队列中。

  • Node.js服务器执行该功能,在这种情况下,该功能将渲染“/about.html”页面,然后将其发送回您的Web浏览器。

出色地, 我明白那个

  • 节点的目标是提供一种简单的方法来构建可扩展网络程序。
  • Node 的设计类似于 Ruby 的 Event Machine 或 Python 的 Twisted 等系统,并受其影响。
  • V8 javascript 的事件 I/O。

对我来说,这意味着你的所有三个假设都是正确的。这个图书馆看起来确实很有前途!

另外,不要忘记提及 Google 的 V8 非常快。它实际上将 JavaScript 代码转换为机器代码,并具有与编译后的二进制文件相匹配的性能。因此,与所有其他伟大的事情一样,它的速度非常快。

问:编程模型是事件驱动的,尤其是它处理的方式 输入/输出.

正确的。它使用回调,因此任何访问文件系统的请求都会导致将请求发送到文件系统,然后 Node.js 将开始处理其下一个请求。它只会在从文件系统获得响应后才担心 I/O 请求,此时它将运行回调代码。但是,可以发出同步 I/O 请求(即阻塞请求)。由开发人员选择异步(回调)或同步(等待)。

问:它使用 JavaScript,解析器是 V8。

是的

问:它可以轻松地用于创建并发服务器应用程序。

是的,尽管您需要手动编写大量 JavaScript 代码。最好看一下框架,例如 http://www.easynodejs.com/ - 附带完整的在线文档和示例应用程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top