Node.js

**Node.js** 是能夠在伺服器端運行 JavaScript 的開放原始碼、跨平台執行環境。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 範例：

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

## 技術

### 執行緒

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

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

### 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++ 將各部分與作業系統進行聯絡。

### npm

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

### 統一 API

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

### 事件迴圈

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

## 替代品

### JXcore

JXcore 是一個開放原始碼的 Node.js 的分支，旨在支援行動裝置和物聯網。第一個 Beta 版本於 2014 年 1 月釋出。它於 2015 年 2 月 13 日開源並且可從 GitHub 倉庫獲得。JXcore 同時使用 Google V8 和 Mozilla SpiderMonkey 兩個引擎。因此 JXcore 可以通過 Mozilla SpiderMonkey 在 iOS 裝置上執行 Node 應用程式。

### 其他語言

類似的語言和開發環境有：

* Python：Tornado 和 Twisted
* Perl：Perl Object Environment
* C 語言：libevent
* Java、JavaScript、Groovy、Python、Scala、Clojure、Ruby、Ceylon 等：Vert.x
* Java 和 Scala：Akka
* Ruby：EventMachine
* D 語言：vibe.d
* Lua：Luvit
* OCaml：Ocsigen

## 參見

* Rhino (JavaScript 引擎)
* npm：廣泛使用的 Node.js 安裝套件管理器
* MEAN
* JSAN（JavaScript Archive Network），一個不太常用的 JavaScript 安裝套件管理器

## 參考文獻

## 外部連結

* 官方網站
* Node.js 原始碼（頁面存檔備份，存於網際網路檔案館）
* Also Read -Best Magento 2 Extensions （頁面存檔備份，存於網際網路檔案館）