NODE.JS
Last updated
Last updated
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
「runtime」 指的是執行環境,就如同網頁上的 JavaScript 是在瀏覽器的 JavaScript 引擎上執行,Node.js 就是一個能執行 JavaScript 的環境,而 V8 則是主流瀏覽器 - Google Chrome 的 JavaScript 引擎,負責解析、執行 JavaScript,也就是負責實踐 ECMAScript 規範中定義的部份;另外,V8 是開源的專案,有興趣的讀者可以參照 Google Git - V8。
Node.js 以 V8 為核心,加上一系列 C/C++ 的套件,成功的讓 Server 端也可以執行 JavaScript。
Node.js 是能夠在伺服器端運行 JavaScript 的開放原始碼。
Node.js 的基本模組是使用 JavaScript 語言編寫。在 Node.js 出現之前,JavaScript 通常作為用戶端程式設計語言使用,以 JavaScript 寫出的程式常在用戶的瀏覽器上執行。Node.js 的出現,讓 JavaScript 也能在伺服器端編程。
Node.js 就是一個可以執行 JavaScript 的環境,而這個環境除了提供瀏覽器 Web API 實作的 setTimeout、setInterval、console 之外,也因為執行環境不同,有另外一系列的 API 供開發者使用,例如可以讀寫檔案的 fs、處理網路請求的 http、做加解密雜湊處理的 crypto、設定叢集的 cluster 等等。
詳細的使用說明,可以參考 Node.js 的官網文件
由於 JavaScript 擁有單執行緒的特性,且為了讓執行緒不會被需要等待的同步程式卡住,必須透過事件迴圈的機制來實現這個目標。如果各位讀者還有印象,我們在 這篇 有聊過瀏覽器中 JavaScript 的事件迴圈,其中有很大一部分是由瀏覽器完成的;在 Node.js 中則透過 libuv 來實現這部分的機制。不同於瀏覽器的事件迴圈,Node.js 中的事件迴圈大致會有以下幾個階段:
timers:執行 setTimeout setInterval 給的 callback
pending callbacks:執行被延遲到下一個事件迴圈的 I/O Callback
idle, prepare:Node.js 內部專用的階段
poll:檢索新的 I/O events,執行 I/O callbacks
check:執行 setImmediate 給的 callback。
close callbacks:執行關閉資源的 callback,例如 socket.on('close', ...)
相對於瀏覽器的事件迴圈多了好多個階段,但其實只是把所有的 callback 分成了四種:timers、I/O events、immediates、close handlers,並依照順序輪流執行,其他在概念上還是一樣的:每個階段有自己的 Queue,輪到它時清空 Queue,到下個階段,周而復始。
為避免主執行緒阻塞,poll 階段可以設定執行上限,到達上限時就會將 Queue 內的東西移交到 pending callbacks 階段的 Queue 中,下一個事件迴圈時再接續執行。
比較需要注意的地方是,微任務佇列(microtask queue)在每個階段結束後都會執行、清空,順序是先清空 process.nextTick 的 callback,再執行其他的如 Promise 的 callback。
常有人誤解 process.nextTick,會想問例如「一個 Tick 是多久?」之類的問題,但其實 Tick 指的就是事件迴圈中的一個階段,因此時間是不固定的喔!