Node.js 不是一種程式語言
今天突然意識到說「我會寫 Node.js 」時,其實是下意識把 Node.js 當成一種程式語言。
正確來說, Node.js 其實是一種 runtime environment, 專門用來執行 JavaScript 程式的環境,讓 JavaScript 不再侷限於只能在瀏覽器中運行。
所以千萬別在履歷上的程式語言一欄擺上 Node.js, 對於嚴謹的面試官來說是會扣分的一項行為(雖然篩選履歷的 HR 通常不會懂這個差異,即使如此,我們還是要把專業擺出來啊!)。
Node.js 現在經常應用在後端(backend)領域,主要由於其 event-driven 的架構以及非同步(asynchronous) I/O 的能力,使得 Node.js 相當適合應用在有著大量 I/O 的 Web 應用,或是對於即時性要求的聊天、遊戲等應用。
此外, Node.js 的核心特點是它是單執行緒的 process, 該執行緒跑著 1 個稱為 event loop 的重要功能,專門處理各種非同步事件,對於 I/O 類型的工作它可說是駕輕就熟,但不擅長應付重 CPU 密集型(CPU-bound)的工作,因為執行 CPU 運算時,它會佔據 event loop ,使它無法同時處理其他工作,從而導致效能下降,所以如果你的應用是 CPU 密集型的話,是無法享受 Node.js 所帶來的好處的,這時最好考慮透過更改系統架構,將 CPU 密集型的工作交給其他更適合的程式語言/框架/伺服器處理,讓 Node.js 專注在 I/O 類型的工作即可。
最後,也由於 Node.js 是單執行緒的 process, 即使有多個 CPU 核心,Node.js 也無法有效利用,它最多就只能跑在一個 CPU 核心上,所以在多核心 CPU 的伺服器上,我們通常都會執行多個 Node.js 的 process 以有效利用 CPU 並提升效能,這也是為什麼你會在多核心的伺服器上看到多個 Node.js 的後端應用跑會在不同的通訊埠的原因。
以上,希望這篇短文介紹能夠讓大家更懂什麼是 Node.js 以及它的優勢與侷限。