乐趣区

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

# 未完待续 …

退出移动版