Node.js

Node.js 是跨平臺、開源的 JavaScript 執行環境，可在 Windows、Linux、macOS 等作業系統上執行。Node.js 由 OpenJS Foundation （原為 Node.js Foundation，已與 JS Foundation 合併）持有和維護，亦為 Linux 基金會的專案。Node.js 採用 Google 開發的 V8 執行程式碼，使用事件驅動和非同步輸入輸出模型等技術來提高效能，可最佳化應用程式的傳輸量和規模。這些技術通常用於資料密集的即時應用程式。

Node.js 大部分基本模組都用 JavaScript 語言編寫。在 Node.js 出現之前，JavaScript 通常作為使用者端程式設計語言使用，以 JavaScript 寫出的程式常在使用者的瀏覽器上執行。Node.js 的出現使 JavaScript 也能用於伺服器端程式設計。Node.js 含有一系列內建模組，使得程式可以脫離 Apache HTTP Server 或 IIS，作為獨立伺服器執行。

目前，Node.js 已被 IBM、Microsoft、Yahoo!、Walmart、Groupon、SAP、LinkedIn、Rakuten、PayPal、Voxer、GoDaddy 等企業採用。

概覽

Node.js 可透過 JavaScript 和一系列模組來編寫伺服器端應用和網路相關的應用。核心模組包括檔案系統 I/O、網路（HTTP、TCP、UDP、DNS、TLS/SSL 等）、二進位制資料流、加密演算法、資料流等等。Node 模組的 API 形式簡單，降低了程式設計的複雜度。

使用框架可以加速開發。常用的框架有 Express.js、Socket.IO 和 Connect 等。Node.js 的程式可以在 Microsoft Windows、Linux、Unix、Mac OS X 等伺服器上執行。Node.js 也可以使用 CoffeeScript（一種旨在簡化 JavaScript 的替代語言，其程式碼可按照一定規則轉化為合法的 JavaScript 程式碼）、TypeScript（微軟開發的強化了資料型別的 JavaScript 變體）、Dart 語言，以及其他能夠編譯成 JavaScript 的語言程式設計。

Node.js 主要用於編寫像 Web 伺服器一樣的網路應用，這和 PHP 和 Python 是類似的。但是 Node.js 與其他語言最大的不同之處在於，PHP 等語言是阻塞的（只有前一條命令執行完畢才會執行後面的命令），而 Node.js 是非阻塞的（多條命令可以同時被執行，透過回撥函式得知命令已結束執行）。

Node.js 是事件驅動的。開發者可以在不使用執行緒的情況下開發出一個能夠承載高併發的伺服器。其他伺服器端語言難以開發高併發應用，而且即使開發出來，效能也不盡如人意。Node.js 正是在這個前提下被創造出來。Node.js 把 JavaScript 的易學易用和 Unix 網路程式設計的強大結合起來。

Node.js 使用 Google V8 JavaScript 引擎，因為：

V8 是基於 BSD 許可證的開源軟體
V8 速度非常快
V8 專注於網路功能，在 HTTP、DNS、TCP 等方面更加成熟

Node.js 已經有數十萬模組，它們可以透過一個名為 npm 的管理器免費下載。Node.js 開發社群主要有兩個郵件列表、一個在 freenode 的名為 #node.js 的 IRC 頻道。社群集中在 NodeConf。

歷史

Node.js 於 2009 年寫成，原始作者是美國軟體工程師瑞安・達爾（Ryan Dahl）。Node.js 結合了 Google 的 V8、事件驅動模式和低階 I/O 介面，其設計靈感源自 Flickr 的一款上傳進度欄：在上傳過程中，瀏覽器並不清楚有多少檔案已經發送到伺服器，除非向伺服器進行查詢，於是達爾想出了一個更簡便的方法。Node.js 的開發和維護工作由達爾本人主持，而他所在的 Joyent 公司也提供了贊助。2009 年 11 月 8 日，達爾在歐洲 JSConf 大會上展示了 Node.js 專案，並受到了觀眾讚賞。在演講中，達爾針對 Apache HTTP Server 和順序程式設計方式提出了批評，認為 Apache 處理大量併發連線（10,000 甚至更多）的可能性有限，而且順序程式設計方式在多連線情況下會造成阻塞，或者消耗更多資源；而 Node.js 提供了基於事件驅動和非阻塞的介面，可用於編寫高併發狀態下的程式，而且 JavaScript 的匿名函式、閉包、回撥函式等特性就是為事件驅動而設計的。

2010 年 1 月，一款名為 “npm” 的軟體包管理系統誕生。npm 使程式設計師能夠更方便地釋出和分享 Node.js 類庫及原始碼，而且簡化了類庫安裝、升級與解除安裝的過程。Node.js 最初只支援 Linux 和 Mac OS X 作業系統。2011 年 6 月，微軟和 Joyent 共同合作，把 Node.js 移植到了 Windows 系統上面，並且在 7 月釋出了第一個正式支援 Windows 系統的版本。

2012 年 1 月，達爾離開了 Node.js 專案，開發工作由他的同事以及 npm 創始人艾薩克・施呂特（Isaac Schlueter）繼續主持。2014 年 2 月，蒂莫西・費里斯（Timothy J. Fontaine）接任專案主管。

由於長期對 Joyent 的管理感到不滿，Node.js 核心開發者 Fedor Indutny 在 2014 年 12 月製作了分支版本，並起名 “io.js”。與 Node.js 相對的是，io.js 採用開放管理模式進行管理，並計劃始終採用最新版的 V8 引擎。為了在使用者、廠商和開發者之間取得平衡，Node.js 基金會於 2015 年初成立。基金會得到了 IBM、Intel、微軟、Joyent 等公司的支援。6 月，Node.js 和 io.js 開發者社群共同決定合併到 Node.js 基金會之下。同年 9 月，Node 4.0 釋出，Node.js 和 io.js 正式合併。4.0 版引入了 ES6 的語言特性和 “長期支援版本” 的釋出週期。到了 2016 年，io.js 宣佈不再發布新版本，並建議開發者換回 Node.js。

程式範例

用 Node.js 撰寫的 HTTP Server 版 hello world 範例：

const http = require ('http');

http.createServer ((request, response) => {response.writeHead (200, { 'Content-Type': 'text/plain'});

response.end ('Hello World!');

}).listen (8000);

console.log ('Server running at http://127.0.0.1:8000/');

另一個簡單的 TCP 伺服器範例，監聽（Listening）埠 7000 並輸出（echo）之前輸入的訊息：

const net = require ('net');

net.createServer (stream => {stream.write ('hello\r\n');

stream.on ('end', => stream.end ('goodbye\r\n'));

stream.pipe (stream);

}).listen (7000);

技術

4.1 執行緒

Node.js 以單執行緒執行，使用非阻塞 I/O 呼叫，這樣既可以支援數以萬計的並行連線，又不會因多執行緒本身的特點而帶來麻煩。眾多請求只使用單執行緒的設計意味著可以用於建立高並行應用程式。Node.js 應用程式的設計目標是任何需要操作 I/O 的函式都使用回呼函式。

這種設計的缺點是，如果不使用 cluster、StrongLoop Process Manager 或 pm2 等模組，Node.js 就難以處理多核或多執行緒等情況。

4.2 V8

V8 是為 Google Chrome 設計的 JavaScript 執行引擎，Google 於 2008 年將其開源。V8 用 C++ 寫成，它將 JavaScript 原始碼編譯成本地機器碼而不是解釋執行。

Node.js 用 libuv 來處理非同步事件，而 V8 提供了 JavaScript 的即時執行環境。libuv 是一個網路和檔案系統功能的抽象層，既可以用於 Windows 又可以用於符合 POSIX 標準的系統，例如 Linux、OS X 和 Unix。

Node.js 的核心功能被包含進一個 JavaScript 庫，並透過 C++ 將各部分與作業系統進行聯絡。

4.3 npm

npm 是 Node.js 附帶的包管理器。npm 是一個命令列工具，用於從 NPM Registry 中下載、安裝 Node.js 程式，同時解決依賴問題。npm 提高了開發的速度，因為它能夠負責第三方 Node.js 程式的安裝與管理。

4.4 統一 API

Node.js 將瀏覽器、資料（例如 MongoDB 或 CouchDB）等組合到一起，透過 JSON 提供一個統一的介面。由於前端框架和一些基本的後端開發技術（如 MVC、MVP、MVVM 等）變得流行，Node.js 也支援客戶端和伺服器端重新利用相同的模型和介面。

4.5 事件迴圈

Node.js 將其註冊到作業系統中，這樣可以及時注意到新連線的產生。當新連線產生時，作業系統會產生一個回撥。在 Node.js 執行時內部，每個連線都被分配一個小型的堆。與其他伺服器程式不同的是，Node.js 不使用程序或執行緒處理連線，而是採用事件迴圈來處理併發連線。而且 Node.js 的事件迴圈不需要手動呼叫。在回撥函式定義之後，伺服器進入事件迴圈。當回撥函式均被執行完畢之後，Node.js 結束事件迴圈。

開發工具

桌面 IDE

Atom（免費、開源軟體）
Brackets（免費、開源軟體）
Sublime Text（商業軟體）
JetBrains IntelliJ IDEA（商業軟體）
JetBrains WebStorm（商業軟體）
Microsoft Visual Studio with Node.js Tools for Visual Studio（商業軟體）
Microsoft Visual Studio with TypeScript（商業軟體）
Nodeclipse Enide Studio（免費、開源軟體、在 Eclipse 基礎上開發）
NoFlo –與 GNOME API 整合的流式開發環境
Visual Studio Code（免費、開源軟體）

線上編輯器

Koding
Codenvy IDE
Cloud9 IDE
Codiad

執行時和偵錯程式

Microsoft Visual Studio（商業）with Node.js Tools for Visual Studio（免費）
Microsoft WebMatrix（免費、閉源軟體）
Visual Studio Code

框架

伺服器端框架：Express.js, Socket.IO, Koa.js, Hapi.js, Total.js
MVC 框架：Meteor, Derby, Sails, Mean, MeanJS, Tower.js, Nombo, Geddy, Compound, Yahoo! Mojito

替代品

以下是相容 Node.js 程式碼的執行時。

6.1 Bun

Bun 是用 Zig 語言編寫的 JavaScript 執行時，支援 JavaScript 和 TypeScript 專案的測試、編譯和執行。首個對外版本於 2022 年 7 月釋出。