1. 程式人生 > 實用技巧 >node.js入門筆記2

node.js入門筆記2

1.阻塞與執行緒

什麼是阻塞(block)呢? 執行緒在執行中如果遇到磁碟讀寫或網路通訊(統稱為 I/O 操作),通常要耗費較長的時間,這時作業系統會剝奪這個執行緒的 CPU 控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為 阻塞。當 I/O 操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其對CPU的控制權,令其繼續執行。 這種 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O(Blocking I/O)。 非同步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)則針對所有 I/O 操作不採用阻塞的策略。 當執行緒遇到 I/O 操作時,不會以阻塞的方式等待 I/O 操作的完成或資料的返回,而只是將 I/O 請求傳送給作業系統,繼續執行下一條語句。當作業系統完成 I/O 操作時,以事件的形式
通知執行 I/O 操作的執行緒,執行緒會在特定時候處理這個事件。 為了處理非同步 I/O,執行緒必須有事件迴圈,不斷地檢查有沒有未處理的事件,依次予以處理。 Node.js使用的是單執行緒、非阻塞的時間程式設計模式。

2.回撥函式

Node.js使用非同步的方式讀取檔案:

//readfile.js 
var fs = require('fs'); 
fs.readFile('file.txt', 'utf-8', function(err, data) { 
 if (err) { 
   console.error(err); 
 } else { 
   console.log(data); 
 } 
}); 
console.log(
'end.');

執行的結果如下:   end.   Contents of the file.

3.事件

Node.js 所有的非同步 I/O 操作在完成時都會發送一個事件到事件佇列。

事件由EventEmitter物件提供,

//event.js

var
EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event occured.'); }); setTimeout(function() {
event.emit('some_event'); }, 1000);

1秒後控制檯輸出了 some_event occured.。其原理是 event 物件註冊了事件 some_event 的一個監聽器, 然後我們通過 setTimeout 在1000毫秒以後向event 物件傳送事件 some_event,此時會呼叫 some_event 的監聽器

Node.js的事件迴圈機制

Node.js 程式由事件迴圈開始,到事件迴圈結束,所有的邏輯都是事件的回撥函式,所以 Node.js 始終在事件迴圈中。 事件的回撥函式在執行的過程中,可能會發出 I/O 請求或直接發射(emit)事件,執行完畢後再返回事件迴圈,事件迴圈會檢查事件佇列中有沒有未處理的事件,直到程式結束。

4.模組和包

Node.js提供了require函式來呼叫其他模組,而且模組都是基於檔案的,機制十分簡單。

(1)什麼是模組?

模組是 Node.js 應用程式的基本組成部分,檔案和模組是一一對應的。換言之,一個Node.js 檔案就是一個模組,這個檔案可能是 JavaScript 程式碼、JSON 或者編譯過的 C/C++ 擴充套件。

(2)建立以及載入模組

Node.js 提供了 exportsrequire 兩個物件,其中 exports 是模組公開的介面,require 用於從外部獲取一個模組的介面,即所獲取模組的 exports 物件。

(3)建立包

包是將某個獨立的功能封裝起來,用於釋出、更新、依賴管理和版本控制。Node.js使用npm來解決包的釋出和獲取需求。