译:使用频率最高的前30个Nodejs面试问题 の 01-10

做者 • Dhanjiv Pandey • 本文出处 • 已得到中译受权
做者twitter
译者主页node

译者按: 2018年的文章,其中部分问题放在今天仍然不算过期。

# Q-01:什么是Node.js?

简单的说 Node.js 就是运行在服务端的 JavaScript。 是一个基于Chrome JavaScript 运行时创建的一个平台。 c++

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度很是快,性能很是好。 web

Node.js是单线程的,它采用基于事件循环的并发模型。它不会阻塞代码运行 (译者:非阻塞I/O模型) ,而是注册一个容许应用程序继续运行的回调。这意味着Node.js能够处理并发操做而无需建立多个执行线程,所以能够很好地扩展 (译者:处理并发操做和扩展有什么直接关系?)。 是构建运行在分布式设备上的数据密集型实时程序的完美选择。shell

如下是使用Node.js的最佳领域:express

  • 调用I/O的应用程序
  • 数据流应用
  • 数据密集型实时应用程序(DIRT)(译者:DIRT是啥?)
  • 基于JSON API的应用程序
  • 单页应用(SPA)

同时,它不适合那些占用较多CPU使用量的大型应用程序。编程

# Q-02:Node.js的主要功能是什么?

让咱们看一下Node.js的一些关键功能。segmentfault

  • 异步事件驱动的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具备高度的可扩展性,使用它能够处理大量的请求,而不须要等待任何函数返回预期的结果。

# 未完待续 ...

相关文章
相关标签/搜索