作者 • Dhanjiv Pandey • 本文出处 • 已获得中译授权
• 作者twitter
• 译者主页
译者按: 2018年的文章,其中部分问题放在今天仍然不算过时。
# Q-01:什么是Node.js?
简单的说 Node.js 就是运行在服务端的 JavaScript。 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
Node.js是单线程的,它采用基于事件循环的并发模型。它不会阻塞代码运行 (译者:非阻塞I/O模型) ,而是注册一个允许应用程序继续运行的回调。这意味着Node.js可以处理并发操作而无需创建多个执行线程,因此可以很好地扩展 (译者:处理并发操作和扩展有什么直接关系?)。 是构建运行在分布式设备上的数据密集型实时程序的完美选择。
以下是使用Node.js的最佳领域:
- 调用I/O的应用程序
- 数据流应用
- 数据密集型实时应用程序(DIRT)(译者:DIRT是啥?)
- 基于JSON API的应用程序
- 单页应用(SPA)
同时,它不适合那些占用较多CPU使用量的大型应用程序。
# Q-02:Node.js的主要功能是什么?
让我们看一下Node.js的一些关键功能。
- 异步事件驱动的IO有助于处理并发请求 —— Node.js的所有API都是异步的。此功能意味着,如果Node.js 收到对某些Input/Output操作的请求,它将在后台执行该操作并继续处理其他请求,而无需等待先前请求的响应结果。
- 代码执行速度更快 —— Node.js使用V8 JavaScript引擎,就是 Google Chrome 使用的那个。Node在JavaScript引擎上有一个包装器,这使得V8引擎更快,因此Node.js中的请求处理也更快 (译者:Node原来这么酷吗?I了I了)。
- 单线程但高度可扩展 —— Node.js使用单线程模型进行事件循环。这些事件的响应可能会或可能不会立即到达服务器。但是,这不会阻止其他操作。从而使Node.js具有高度可扩展性。传统服务器创建有限的线程来处理请求,而Node.js创建一个线程来为大量的此类请求提供服务。
- Node.js库使用JavaScript语法 —— 从开发人员的角度来看,这是Node.js的另一个重要功能。大多数开发人员已经精通JavaScript。因此,对于熟悉JavaScript的开发人员而言,Node.js中的开发变得更加容易。
- Node.js有一个活跃的、充满活力的社区 —— 活跃的社区总是让Node.js跟上web开发的最新趋势。
- No Buffering —— Node.js应用程序从不缓冲任何数据。他们只是简单地以块的形式输出数据 (译者:Buffering是缓冲的意思吧?)。
# Q-02:请说明我们何时使用Node.js,何时不使用它?
我们什么时候应该使用Node.js?
使用Node.js来开发流媒体或基于事件的实时应用程序是非常理想的,这些应用程序需要更少的CPU使用,比如:
- 聊天应用程序。
- 游戏服务器。
Node.js非常适合需要同时处理数千个用户请求的服务。
- 适合协同环境。
It is suitable for environments where multiple people work together. For example, they post their documents, modify them by doing check-out and check-in of these documents.
它适用于多人一起工作的环境。例如,他们发布其文档,通过检出和检入这些文档来对其进行修改 (译者:这句话没有理解)。
Node.js通过为文档的每次更改创建一个事件循环来支持这种情况。Node.js的“事件循环”功能使它可以同时处理多个事件而不会被阻塞。 - 广告服务器。
同样,我们的服务器可以处理数千个从中央主机下载广告的请求。Node.js是处理此类任务的理想解决方案。 - 流媒体服务器。
使用Node.js的另一种理想方案是用于多媒体流服务器,客户端向服务器发出请求,从服务器上下载不同的多媒体内容。。
总而言之,当您需要高级别的并发性但需要占用CPU更少的时间时,最好使用Node.js。
最后但并非最不重要的一点,因为Node.js内部使用JavaScript,所以它最适合于构建也使用JavaScript的客户端应用程序。
何时不使用Node.js?
- 不管怎样,我们可以将Node.js用于各种应用程序。但它是一个单线程框架,因此在应用程序需要运行较长时间的情况下,我们不应该使用它。如果服务器正在做一些计算,它将无法处理任何其他请求。因此,当需要占用CPU更少的时间时,Node.js是最佳选择。
# Q-04:您可以使用哪些IDE进行Node.js开发?
下面列出了开发node.js应用程序最常用的IDE:
- Cloud9
它是一个免费的基于云的IDE,使用流行的编程语言(如Node.js,PHP,C ++,Meteor等)支持应用程序开发。它提供了功能强大的在线代码编辑器,使开发人员能够编写,运行和调试应用程序代码 (译者:Cloud9是亚马逊提供的一个云编辑器)。 - JetBrains WebStorm
WebStorm是一个轻量级但功能强大的JavaScript IDE,非常适合使用Node.js进行客户端和服务器端开发。IDE提供的功能包括智能代码完成,导航,自动化和安全的重构。此外,我们可以使用IDE中提供的调试器,VCS,终端和其他工具。 - JetBrains InteliJ IDEA。
它是一个强大的IDE,可以使用主流技术(例如Node.js,Angular.js,JavaScript,HTML5等)支持Web应用程序开发。为了使IDE能够进行Node.js开发,我们必须安装Node.js插件。它提供的功能包括语法突出显示,代码辅助,代码完成等。我们甚至可以运行和调试Node.js应用程序,并在IDE中直接查看结果。它的JavaScript调试器提供了条件断点,表达式评估和其他功能。 - Komodo IDE
它是一个跨平台的IDE,支持使用主要编程语言(例如Node.js,Ruby,PHP,JavaScript等)进行开发。它提供了多种功能,包括语法突出显示,键盘快捷键,可折叠窗格,工作区,自动缩进,代码折叠和使用内置浏览器进行代码预览。 - Eclipse
它是一个流行的基于云的IDE,用于使用Java、PHP、c++等进行web开发。您可以使用Node.js插件 <nodeclipse> 轻松利用Eclipse IDE的功能 (译者:Eclipse是基于云吗?懵逼)。 - Atom
它是一个集成了HTML,JavaScript,CSS和Node.js的开源应用程序。它在Electron框架之上工作,使用Web技术开发跨平台应用程序。Atom预先安装了四个用户界面和八个语法主题(深色和浅色)。我们还可以安装由Atom社区创建的主题,或者根据需要创建自己的主题。
(译者:VSCode不写吗???VSCode吹爆!)
# Q-05:解释Node.js如何工作?
Node.js应用程序在调用时创建一个线程。每当Node.js收到请求时,服务器都会先完成其处理,然后再处理下一个请求。
Node.js通过使用事件循环和回调函数来异步工作,以并行处理多个请求。事件循环是一种处理外部事件并将其转换为回调函数的功能。它在适当的时间调用所有事件处理程序。这样,在处理单个请求时,大量工作是在后台完成的,因此,如果处理未完成,新的传入请求也不必等待。
在处理请求时,Node.js会向其附加一个回调函数,并将其移至后台。现在,只要它的响应准备好了,就会调用一个事件,该事件触发关联的回调函数发送此响应。
让我们以杂货店送货为例。
通常,送货员到每个房子去运送包裹。Node.js以相同的方式工作,并且一次处理一个请求。当任何一所房子没有打开时,就会出现问题。送货员不能在一所房子停下来等它打开。他接下来要做的是打电话给房主,并要求他在房屋开门时打电话。同时,他将去其他地方送货。Node.js的工作方式相同。它不等待请求处理完成(房屋开放)。相反,它附加了一个回调函数(房屋所有者的呼叫)。每当请求处理完成(房屋开放)时,都会调用一个事件,该事件触发关联的回调函数发送响应。
To summarize, Node.js does not process the requests in parallel. Instead, all the back-end processes like, I/O operations, heavy computation tasks, that take a lot of time to execute, run in parallel with other requests.
总而言之,Node.js不会并行处理请求(单线程一次处理一个)。所有后台进程,如I/O操作、耗费大量时间执行的繁重计算任务,都与其他请求并行运行 (译者:这句话没有理解)。
# Q-06:用Node.js中解释REPL
REPL代表 “Read Eval Print Loop”。这是一个简单的程序,它接受命令,计算它们,最后打印结果。REPL提供了类似于Unix/Linux shell或窗口控制台的环境,我们可以在其中输入命令,然后系统用输出进行响应。REPL执行以下任务:
- READ
它从用户那里读取输入,将其解析为JavaScript数据结构,然后将其存储在内存中。 - EVAL
它执行数据结构。 - PRINT
它打印对命令求值后得到的结果。 - LOOP
它循环执行上述命令,直到用户按Ctrl+C两次。
# Q-07:Node.js是否完全基于单线程?
是的,Node.js确实在一个线程上处理所有请求。但这只是Node.js设计理论的一部分。实际上,与单线程机制相比,它使用事件和回调来处理更大的异步请求。
此外,Node.js的优化设计利用了JavaScript和C++来保高性能。JavaScript通过Google Chrome v8引擎在服务器端执行。c++ lib的UV库通过后台来处理非顺序的I/O。
为了进行实际说明,让我们假设在Node.js队列中排列了100个请求。按照设计,Node.js事件循环的主线线程将接收所有事件并转发给后台worker执行。一旦后台worker处理完请求,注册的回调将在事件循环线程上得到通知,将结果传递回用户。
# Q-08:如何在Node.js中获取 Post 数据?
下面是使用Node.js获取Post数据的代码片段:
app.use(express.bodyParser());
app.post('/', function(request, response){
console.log(request.body.user);
});
# Q-09:如何在Node.js中发出Post请求?
下面是使用Node.js发出Post请求的代码片段:
var request = require('request');
request.post(
'http://www.example.com/action',
{ form: { key: 'value' } },
function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body)
}
}
);
# Q-10:Node.js中的回调指的是什么?
我们可以调用“回调”作为一个异步等效函数。Node.js大量使用回调,并在任务完成时触发回调。Node.js的所有API均以支持回调的方式编写。
例如,假设我们有一个读取文件的函数,当它开始读取文件时,Node.js立即将控制权返回到执行环境,以便下一条指令可以执行。一旦文件读取操作完成,它将调用回调函数并将文件内容作为参数传递。因此文件I/O,没有阻塞或等待。此功能使Node.js具有高度可伸缩性,使用它可以处理大量请求,而无需等待任何函数返回期望的结果。
例如,假设我们有一个读取文件的函数,当它开始读取文件时,Node.js立即将控制返回到执行环境,以便执行下一条指令。一旦文件读取操作完成,它将调用回调函数并传递文件的内容作为参数。因此,没有阻塞或等待,由于文件I/O。这个功能使得Node.js具有高度的可扩展性,使用它可以处理大量的请求,而不需要等待任何函数返回预期的结果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。