譯:使用頻率最高的前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具備高度的可擴展性,使用它能夠處理大量的請求,而不須要等待任何函數返回預期的結果。

# 未完待續 ...

相關文章
相關標籤/搜索