Node.js 指南(關於Node.js)

博弈發表於2019-02-16

關於Node.js

作為非同步事件驅動的JavaScript執行時,Node旨在構建可伸縮的網路應用程式,在下面的“hello world”示例中,可以同時處理許多連線,在每次連線時都會觸發回撥,但是如果沒有工作要做,Node將會休眠。

const http = require(`http`);

const hostname = `127.0.0.1`;
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader(`Content-Type`, `text/plain`);
  res.end(`Hello World
`);
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

這與目前使用OS執行緒的更常見的併發模型形成對比,基於執行緒的網路效率相對較低且非常難以使用,此外,Node的使用者不必擔心死鎖,因為沒有鎖。Node中幾乎沒有任何函式直接執行I/O,因此程式永遠不會阻塞,由於沒有任何阻塞,可擴充套件系統在Node中開發非常合理。

如果不熟悉這種語言,有一篇關於阻塞與非阻塞的完整文章。

Node在設計上與Ruby的Event Machine或Python的Twisted等系統類似,並受其影響,Node進一步採用事件模型。它將事件迴圈呈現為執行時構造而不是庫,在其他系統中,始終存在阻塞呼叫以啟動事件迴圈。通常,行為是通過指令碼開頭的回撥來定義的,最後通過阻塞呼叫來啟動伺服器,如EventMachine::run()。Node在執行輸入指令碼後簡單地進入事件迴圈,當沒有更多回撥要執行時,Node退出事件迴圈,此行為類似於瀏覽器JavaScript — 事件迴圈對使用者隱藏。

HTTP是Node中的一等公民,設計時考慮了流媒體和低延遲,這使得Node非常適合Web庫或框架的基礎。

僅僅因為Node沒有執行緒設計,並不意味著你無法利用環境中的多個核心優勢,子程式可以通過使用我們的child_process.fork() API生成,並且設計為易於與之通訊,基於相同的介面構建的是群集模組,它允許你在程式之間共享sockets,以便在核心上實現負載平衡。


上一篇:Node.js 指南(目錄)

下一篇:入門指南

相關文章