关于node.js:译使用频率最高的前30个Nodejs面试问题-の-0110

作者 • 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具备高度的可扩展性,应用它能够解决大量的申请,而不须要期待任何函数返回预期的后果。

# 未完待续 …

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

阿里云限时活动-2核2G-5M带宽-40-100G SSD服务器,特惠价86元/年(原价724元/年,限时99元续购三次),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据