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 的原生模組(如 fshttp)底層都是以 C++ 實作。C++ 綁定 就扮演了通訊橋樑的作用,讓我們在 JavaScript 層級呼叫 fs.readFile() 時,能觸發底層 C++ 程式去操作作業系統。

Node.js 標準庫 (Standard Library)

這是我們開發時直接引用的 JavaScript API,例如 path, os, stream, events 等,讓開發者能以簡潔的代碼處理複雜的運算。

運作流程圖解

這是一個概念性的流程,說明請求是如何被處理的:

  1. 使用者程式碼:透過廣泛的 Node.js API 發出請求。
  2. Node.js Bindings:將請求轉譯給底層。
  3. V8 引擎:執行非阻塞程式碼。
  4. Libuv:管理非同步事件。如果是 I/O 密集型任務,則交由執行緒池處理。
  5. 作業系統 (OS):執行最終的系統呼叫並回傳結果。

Node.js 的並行真相:單執行緒還是多執行緒?

這是一個在面試中常被問到的問題:

  • JavaScript 層面:Node.js 是單執行緒的。這意味著你的 JS 程式碼、運算邏輯都在同一個主執行緒上依序執行。如果你寫了一個無窮迴圈,整個伺服器就會陷入停擺。
  • 系統底層運作層面:Node.js 是多執行緒的。Libuv 會啟動一個預設大小為 4 的執行緒池來背景處理耗時任務(例如讀取 2GB 的檔案)。主執行緒會立即繼續處理下一個網路請求,直到耗時任務完成後,再透過事件迴圈通知主執行緒執行 Callback。
重要限制:雖然 Node.js 能處理海量的 HTTP 連線(I/O 密集),但它不適合執行 CPU 密集型任務(如 3D 渲染、大規模矩陣運算),因為這類運算會長期霸佔主執行緒,導致其他用戶的連線無法被回應。

總結

Node.js 的強大在於它將「單執行緒執行」與「非阻塞 I/O」完美結合。理解了 V8 與 Libuv 的分工,能幫助你寫出更高併發、更低延遲的後端應用。