node.js能做什麼

Node能做什麼和它的優勢

Node核心思想:1.非阻塞;2.單線程;3.事件驅動。

在目前的web應用中,客戶端和服務器端之間有些交互可以認爲是基於事件的,那麼AJAX就是頁面及時響應的關鍵。每次發送一個請求時(不管請求的數據多麼小),都會在網絡裏走一個來回。服務器必須針對這個請求作出響應,通常是開闢一個新的進程。那麼越多用戶訪問這個頁面,所發起的請求個數就會越來越多,就會出現內存溢出、邏輯交錯帶來的衝突、網絡癱瘓、系統崩潰這些問題。

Node的目標是提供一種構建可伸縮的網絡應用的方案,在hello world例子中,服務器可以同時處理很多客戶端連接。

Node和操作系統有一種約定,如果創建了新的鏈接,操作系統就將通知Node,然後進入休眠。如果有人創建了新的鏈接,那麼它(Node)執行一個回調,每一個鏈接只佔用了非常小的(內存)堆棧開銷。

舉一個簡單的異步調用的例子,把test.js和myMydule.js準備好了。把以下代碼拷貝到test.js中並執行:

  1.  var fs = require('fs');  
  2. fs.readFile('./myModule.js', function (err, data) {  
  3. if (err) throw err;  
  4. console.log('successfully');  
  5. });  
  6. console.log('async'); 

所謂的異步,大家應該都能想得到運行時會先打先顯示"async",再顯示"successfully"。

Node是無阻塞的,新請求到達服務器時,不需要爲這個請求單獨作什麼事情。Node僅僅是在那裏等待請求的發生,有請求就處理請求。

Node更擅長處理體積小的請求以及基於事件的I/O。

Node不僅僅是做一個Web服務的框架,它可以做更多,比如它可以做Socket服務,可以做比方說基於文件的,然後基於像一些比方說可以有子進程,然後內部的,它是一個很完整的事件機制,包括一些異步非注射的解決方案,而不僅僅侷限在網絡一層。同時它可能,即使作爲一個Web服務來說,它也提供了更多可以深入這個服務內核、核心的一些功能,比方說Node使用的Http Agent,這塊就是它可以更深入這個服務內核來去做一些功能。

Node事件流概念

因爲Node 採用的是事件驅動的模式,其中的很多模塊都會產生各種不同的事件,可由模塊來添加事件處理方法,所有能夠產生事件的對象都是事件模塊中的 EventEmitter 類的實例。代碼是全世界通用的語言,所以我們還是用代碼說話:

  1.  var events = require("events");   
  2. var emitter = new events.EventEmitter();   
  3. emitter.on("myEvent", function(msg) {   
  4. console.log(msg);   
  5. });   
  6. emitter.emit("myEvent", "Hello World."); 

簡單的分析這段:

1. 使用require()方法添加了events模塊並把返回值賦給了一個變量

2. new events.EventEmitter()這句創建了一個事件觸發器,也就是所謂的事件模塊中的 EventEmitter 類的實例

3. on(event, listener)用來爲某個事件 event 添加事件處理方法監聽器

4. emit(event, [arg1], [arg2], [...]) 方法用來產生事件。以提供的參數作爲監聽器函數的參數,順序執行監聽器列表中的每個監聽器函數。

EventEmitter 類中的方法都與事件的產生和處理相關:

1. addListener(event, listener) 和 on(event, listener) 這兩個方法都是將一個監聽器添加到指定事件的監聽器數組的末尾

2. once(event, listener) 這個方法爲事件爲添加一次性的監聽器。該監聽器在事件第一次觸發時執行,過後將被移除

3. removeListener(event, listener) 該方法用來將監聽器從指定事件的監聽器數組中移除出去

4. emit(event, [arg1], [arg2], [...]) 剛剛提到過了。

在Node中,存在各式各樣不同的數據流,Stream(流)是一個由不同對象實現的抽象接口。例如請求HTTP服務器的request是一個流,類似於stdout(標準輸出);包括文件系統、HTTP 請求和響應、以及 TCP/UDP 連接等。流可以是可讀的,可寫的,或者既可讀又可寫。所有流都是EventEmitter的實例,因此可以產生各種不同的事件。

可讀流主要會產生以下事件:

data 當讀取到流中的數據時,此事件被觸發

end 當流中沒有數據可讀時,此事件被觸發

error 當讀取數據出現錯誤時,此事件被觸發

close 當流被關閉時,,此事件被觸發,可是並不是所有流都會觸發這個事件。(例如,一個連接進入的HTTP request流就不會觸發'close'事件。)

還有一種比較特殊的 fd 事件,當在流中接收到一個文件描述符時觸發此事件。只有UNIX流支持這個功能,其他類型的流均不會觸發此事件。

相關詳細文檔:http://cnodejs.org/cman/all.html#events_

強大的File System 文件系統模塊

Node 中的 fs 模塊用來對本地文件系統進行操作。文件的I/O是由標準POSIX函數封裝而成。需要使用require('fs')訪問這個模塊。所有的方法都提供了異步和同步兩種方式。

fs 模塊中提供的方法可以用來執行基本的文件操作,包括讀、寫、重命名、創建和刪除目錄以及獲取文件元數據等。每個操作文件的方法都有同步和異步兩個版本。

異步操作的版本都會使用一個回調方法作爲最後一個參數。當操作完成的時候,該回調方法會被調用。而回調方法的第一個參數總是保留爲操作時可能出現的異常。如果操作正確成功,則第一個參數的值是 null 或 undefined 。

同步操作的版本的方法名稱則是在對應的異步方法之後加上一個 Sync 作爲後綴。比如異步的 rename() 方法的同步版本是 renameSync() 。下面列出來了 fs 模塊中的一些常用方法,都只介紹異步操作的版本。

test.js和myModule.js文件準備好了木?把下面這段代碼copy到test.js中執行一次

  1.  var fs = require('fs');  
  2. fs.unlink('./myModule.js', function (err) {  
  3. if (err) throw err;  
  4. console.log('successfully deleted myModule.js');  
  5. }); 

如果沒有報error,那麼myModule.js就被刪除了,就是這麼簡單

這只是一個簡單的例子,感興趣的話自己去多多嘗試,實踐出真理。由於篇幅原因就不多舉例了。^_^

學習Node的總結:

1.對於一個linux的命令和shell知識幾乎爲零的我來說,這段時間又學到了不少關於linux知識;vim真是一個強大的編輯器,不用鼠標的感覺真的很好;而且有一點對我來說很重要,在linux下編程很cool,尤其是在團隊中都是使用windows的,裝裝更健康^_^。

2.理解了服務端JavaScript的一個成功框架-Node,以及它的一些優勢和使用的方式,這篇文章就是最好的總結,當然,這隻會是一個開始。

3.對於沒有進入那麼夢想的公司其實是有那麼點遺憾,不過生活就應該要這樣,有波折有起伏,這正是我需要並且期待的...那麼新的生活還是要繼續,做自己的舵手,把握好自己的方向,過去的就讓它過去吧。

一些想對大夥說的話:

1. 在這我得打擊一部分人的積極性。假如你對後臺技術不夠了解或者沒接觸過服務端語言,不知道I/O這些知識,沒有後臺處理流程這種概念,那麼......Node並不是一門適合入門的服務端技術。爲什麼這麼說:

a.重點就是中文實例少,文章少,想系統的學習會比較麻煩,所以在使用過程中總有一種不成熟的感覺,當然主要還是因爲我對它不熟悉所造成的。國內使用Node的公司確實不多,當然國外還是有不少了,從cnodejs.org截了一個圖:

b.對沒有經驗的朋友來說node其實並不好上手,從最簡單“Hello world”就可以看出來(各種運行環境和安裝細節的瞭解都得費點功夫),不要以jQuery庫爲比較,所處理的事物不同,學習的成本也不同 - 所以不太建議作爲新手入門的服務端技術,如果想學習一門服務端語言PHP和Python都是不錯的選擇,因爲:書多 例子多 框架多 上手簡單 容易理解 搭建方便...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章