萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> 什麼是Node.js?

什麼是Node.js?

   這篇文章主要介紹了究竟什麼是Node.js?Node.js有什麼好處?,為試圖解釋什麼是 Node.js,本文將簡要介紹一些背景信息:它要解決的問題,它如何工作,如何運行一個簡單應用程序,最後,Node 在什麼情況下是一個好的解決方案,需要的朋友可以參考下

  Node 是一個服務器端 JavaScript 解釋器,它將改變服務器應該如何工作的概念。它的目標是幫助程序員構建高度可伸縮的應用程序,編寫能夠處理數萬條同時連接到一個(只有一個)物理機的連接代碼。

  簡介

  如果您聽說過 Node,或者閱讀過一些文章,宣稱 Node 是多麼多麼的棒,那麼您可能會想:“Node 究竟是什麼東西?” 即便是在參閱 Node 的主頁之後,您甚至可能還是 不明白 Node 為何物?Node 肯定不適合每個程序員,但它可能是某些程序員一直苦苦追尋的東西。

  為試圖解釋什麼是 Node.js,本文將簡要介紹一些背景信息:它要解決的問題,它如何工作,如何運行一個簡單應用程序,最後,Node 在什麼情況下是一個好的解決方案。本文不涉及如何編寫一個復雜的 Node 應用程序,也不是一份全面的 Node 教程。閱讀本文應該有助於您決定是否應該繼續學習 Node,以便將其用於您的業務。

  Node 旨在解決什麼問題?

  Node 公開宣稱的目標是 “旨在提供一種簡單的構建可伸縮網絡程序的方法”。當前的服務器程序有什麼問題?我們來做個數學題。在 Java™ 和 PHP 這類語言中,每個連接都會生成一個新線程,每個新線程可能需要 2 MB 的配套內存。在一個擁有 8 GB RAM 的系統上,理論上最大的並發連接數量是 4,000 個用戶。隨著您的客戶群的增長,如果希望您的 Web 應用程序支持更多用戶,那麼,您必須添加更多服務器。當然,這會增加服務器成本、流量成本和人工成本等成本。除這些成本上升外,還有一個潛在技術問題,即用戶可能針對每個請求使用不同的服務器,因此,任何共享資源都必須在所有服務器之間共享。鑒於上述所有原因,整個 Web 應用程序架構(包括流量、處理器速度和內存速度)中的瓶頸是:服務器能夠處理的並發連接的最大數量。

  Node 解決這個問題的方法是:更改連接到服務器的方式。每個連接發射一個在 Node 引擎的進程中運行的事件,而不是為每個連接生成一個新的 OS 線程(並為其分配一些配套內存)。Node 聲稱它絕不會死鎖,因為它根本不允許使用鎖,它不會直接阻塞 I/O 調用。Node 還宣稱,運行它的服務器能支持數萬個並發連接。

  現在您有了一個能處理數萬個並發連接的程序,那麼您能通過 Node 實際構建什麼呢?如果您有一個 Web 應用程序需要處理這麼多連接,那將是一件很 “恐怖” 的事!那是一種 “如果您有這個問題,那麼它根本不是問題” 的問題。在回答上面的問題之前,我們先看看 Node 的工作原理以及它的設計運行方式。

  Node 肯定不是什麼?

  沒錯,Node 是一個服務器程序。但是,基礎 Node 產品肯定不 像 Apache 或 Tomcat。本質上,那些服務器 “安裝就緒型” 服 務器產品,支持立即部署應用程序。通過這些產品,您可以在一分鐘內啟動並運行一個服務器。Node 肯定不是這種產品。Apache 能通過添加一個 PHP 模塊來允許開發人員創建動態 Web 頁,添加一個 SSL 模塊來實現安全連接,與此類似,Node 也有模塊概念,允許向 Node 內核添加模塊。實際上,可供選擇的用於 Node 的模塊有數百個之多,社區在創建、發布和更新模塊方面非常活躍,一天甚至可以處理數十個模塊。本文後面將討論 Node 的整個模塊部分。

  Node 如何工作?

  Node 本身運行 V8 JavaScript。等等,服務器上的 JavaScript?沒錯,您沒有看錯。對於只在客戶機上使用 JavaScript 的程序員而言,服務器端 JavaScript 可能是一個新概念,但這個概念本身並非遙不可及,因此為何不能在服務器上使用客戶機上使用的編程語言?

  什麼是 V8?V8 JavaScript 引擎是 Google 用於其 Chrome 浏覽器的底層 JavaScript 引擎。很少有人考慮 JavaScript 在客戶機上實際做了些什麼?實際上,JavaScript 引擎負責解釋並執行代碼。Google 使用 V8 創建了一個用 C++ 編寫的超快解釋器,該解釋器擁有另一個獨特特征;您可以下載該引擎並將其嵌入任何 應用程序。V8 JavaScript 引擎並不僅限於在一個浏覽器中運行。因此,Node 實際上會使用 Google 編寫的 V8 JavaScript 引擎,並將其重建為可在服務器上使用。太完美了!既然已經有一個不錯的解決方案可用,為何還要創建一種新語言呢?

  事件驅動編程

  許多程序員接受的教育使他們認為,面向對象編程是完美的編程設計,這使得他們對其他編程方法不屑一顧。Node 使用了一個所謂的事件驅動編程模型。

  清單 1. 客戶端上使用 jQuery 的事件驅動編程

  代碼如下:

  // jQuery code on the client-side showing how Event-Driven programming works

  // When a button is pressed, an Event occurs - deal with it

  // directly right here in an anonymous function, where all the

  // necessary variables are present and can be referenced directly

  $("#myButton").click(function(){

  if ($("#myTextField").val() != $(this).val())

  alert("Field must match button text");

  });

  實際上,服務器端和客戶端沒有任何區別。沒錯,這沒有按鈕點擊操作,也沒有向文本字段鍵入的操作,但在一個更高的層面上,事件正在 發生。一個連接被建立,這是一個事件!數據通過連接進行接收,這也是一個事件!數據通過連接停止,這還是一個事件!

  為什麼這種設置類型對 Node 很理想?JavaScript 是一種很棒的事件驅動編程語言,因為它允許使用匿名函數和閉包,更重要的是,任何寫過代碼的人都熟悉它的語法。事件發生時調用的回調函數可以在捕獲事件處進行編寫。這樣可以使代碼容易編寫和維護,沒有復雜的面向對象框架,沒有接口,沒有過度設計的可能性。只需監聽事件,編寫一個回調函數,其他事情都可以交給系統處理!

  示例 Node 應用程序

  最後,我們來看一些代碼!讓我們將討論過的所有內容匯總起來,從而創建我們的第一個 Node 應用程序。我們已經知道,Node 對於處理高流量應用程序很理想,所以我們將創建一個非常簡單的 Web 應用程序,一個為實現最快速度而構建的應用程序。下面是 “老板” 交代的關於我們的樣例應用程序的具體要求:創建一個隨機數字生成器 RESTful API。這個應用程序應該接受一個輸入:一個名為 “number” 的參數。然後,應用程序返回一個介於 0 和該參數之間的隨機數字,並將生成的數字返回給調用者。由於 “老板” 希望該應用程序成為一個廣泛流行的應用程序,因此它應該能處理 50,000 個並發用戶。我們來看看以下代碼:

  清單 2. Node 隨機數字生成器

  代碼如下:

  // these modules need to be imported in order to use them.

  // Node has several modules. They are like any #include

  // or import statement in other languages

  var http = require("http");

  var url = require("url");

  // The most important line in any Node file. This function

  // does the actual process of creating the server. Technically,

  // Node tells the underlying operating system that whenever a

  // connection is made, this particular callback function should be

  // executed. Since we're creating a web service with REST API,

  // we want an HTTP server, which requires the http variable

  // we created in the lines above.

  // Finally, you can see that the callback method receives a 'request'

  // and 'response' object automatically. This should be familiar

  // to any PHP or Java programmer.

  http.createServer(function(request, response) {

  // The response needs to handle all the headers, and the return codes

  // These types of things are handled automatically in server programs

  // like Apache and Tomcat, but Node requires everything to be done yourself

  response.writeHead(200, {"Content-Type": "text/plain"});

  // Here is some unique-looking code. This is how Node retrives

  // parameters passed in from client requests. The url module

  // handles all these functions. The parse function

  // deconstructs the URL, and places the query key-values in the

  // query object. We can find the value for the "number" key

  // by referencing it directly - the beauty of JavaScript.

  var params = url.parse(request.url, true).query;

  var input = params.number;

  // These are the generic JavaScript methods that will create

  // our random number that gets passed back to the caller

  var numInput = new Number(input);

  var numOutput = new Number(Math.random() * numInput).toFixed(0);

  //

copyright © 萬盛學電腦網 all rights reserved