weight = 10
[params] nav_head = "核心基礎與環境" +++
Node.js 架構解析:V8 引擎與 Libuv
為什麼 Node.js 能夠在單執行緒 (Single-threaded) 的限制下,依然保有如此優異的併發處理能力?這歸功於它卓越的底層架構設計。我們可以將 Node.js 的運作體系分為幾個主要核心組件。
Node.js 的核心結構
Node.js 本身不僅僅是 JavaScript,它更像是一個強大的執行環境 (Runtime),連接了高階的 JavaScript 與底層的作業系統。其基礎架構由以下四個關鍵部分組成:
V8 引擎 (V8 Engine)
由 Google 開發的高效能 JavaScript 引擎(同樣驅動 Chrome 瀏覽器)。V8 的任務是將 JavaScript 程式碼編譯為直接執行的機器碼 (Machine Code),這讓 JavaScript 的執行速度極快。
Libuv 函式庫
這是 Node.js 最核心的靈魂。Libuv 是一個用 C 語言編寫的多平台支援庫,它主要負責:
- 事件迴圈 (Event Loop):決定非同步任務執行的優先順序與時機。
- 執行緒池 (Thread Pool):處理 JavaScript 無法獨自完成的重型 Tasks,如檔案讀寫 (File I/O)、DNS 查詢與加解密運算。
- 非同步 I/O:網路連線、資料系統通知等底層互動。
C++ 綁定 (C++ Bindings)
JavaScript 本身並沒有權限直接操作電腦硬碟或發送網路封包。Node.js 的原生模組(如 fs 或 http)底層都是以 C++ 實作。C++ 綁定 就扮演了通訊橋樑的作用,讓我們在 JavaScript 層級呼叫 fs.readFile() 時,能觸發底層 C++ 程式去操作作業系統。
Node.js 標準庫 (Standard Library)
這是我們開發時直接引用的 JavaScript API,例如 path, os, stream, events 等,讓開發者能以簡潔的代碼處理複雜的運算。
運作流程圖解
這是一個概念性的流程,說明請求是如何被處理的:
- 使用者程式碼:透過廣泛的 Node.js API 發出請求。
- Node.js Bindings:將請求轉譯給底層。
- V8 引擎:執行非阻塞程式碼。
- Libuv:管理非同步事件。如果是 I/O 密集型任務,則交由執行緒池處理。
- 作業系統 (OS):執行最終的系統呼叫並回傳結果。
Node.js 的並行真相:單執行緒還是多執行緒?
這是一個在面試中常被問到的問題:
- JavaScript 層面:Node.js 是單執行緒的。這意味著你的 JS 程式碼、運算邏輯都在同一個主執行緒上依序執行。如果你寫了一個無窮迴圈,整個伺服器就會陷入停擺。
- 系統底層運作層面:Node.js 是多執行緒的。Libuv 會啟動一個預設大小為 4 的執行緒池來背景處理耗時任務(例如讀取 2GB 的檔案)。主執行緒會立即繼續處理下一個網路請求,直到耗時任務完成後,再透過事件迴圈通知主執行緒執行 Callback。
總結
Node.js 的強大在於它將「單執行緒執行」與「非阻塞 I/O」完美結合。理解了 V8 與 Libuv 的分工,能幫助你寫出更高併發、更低延遲的後端應用。