node.js入門筆記2
阿新 • • 發佈:2020-07-24
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 操作時,以事件的形式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. Contents of the file.'end.');
3.事件
Node.js 所有的非同步 I/O 操作在完成時都會發送一個事件到事件佇列。事件由EventEmitter物件提供,
//event.js1秒後控制檯輸出了 some_event occured.。其原理是 event 物件註冊了事件 some_event 的一個監聽器, 然後我們通過 setTimeout 在1000毫秒以後向event 物件傳送事件 some_event,此時會呼叫 some_event 的監聽器
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);
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 提供了 exports 和 require 兩個物件,其中 exports 是模組公開的介面,require 用於從外部獲取一個模組的介面,即所獲取模組的 exports 物件。(3)建立包
包是將某個獨立的功能封裝起來,用於釋出、更新、依賴管理和版本控制。Node.js使用npm來解決包的釋出和獲取需求。